我有一个复选框并单击事件以获取更新数据的复选框。当我单击复选框时,数据正在更新,但未选中复选框。
这是我的HTML代码:
<td>
<input type="checkbox" data-bind="checked: status, disable: status, click: $root.UpdateStatus" />
</td>
这是我的剧本:
self.UpdateStatus = function (tblUsers) {
$.ajax({
type: "POST",
url: 'SinglePageApp.aspx/UpdateStatus',
data: "{statusVal: 'true',goalId: " + tblUsers.goalId + "}",
contentType: "application/json; charset=utf-8",
success: function (result) {
alert(result.d);
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
alert(textStatus);
alert(errorThrown);
}
});
};
我希望我的复选框在点击时进行检查。然后在点击复选框后放入更新的数据。
答案 0 :(得分:22)
见:http://knockoutjs.com/documentation/click-binding.html
注意3:允许默认点击操作
默认情况下,Knockout将阻止click事件进行任何操作 默认动作。这意味着如果您在a上使用click绑定 例如,标签(链接),浏览器只会调用您的处理程序 功能,不会导航到链接的href。这很有用 默认,因为当你使用点击绑定时,通常是因为 您正在使用该链接作为操纵您的视图的UI的一部分 模型,而不是作为另一个网页的常规超链接。但是,如果您确实要让默认点击操作继续,请执行 从您的点击处理函数返回true 。
<小时/> 修改添加了示例,显示了在函数中返回
true
的位置。它必须从实际函数本身返回,而不是Ajax success
或error
处理程序。
self.UpdateStatus = function (tblUsers) {
$.ajax({
type: "POST",
url: 'SinglePageApp.aspx/UpdateStatus',
data: "{statusVal: 'true',goalId: " + tblUsers.goalId + "}",
contentType: "application/json; charset=utf-8",
success: function (result) {
alert(result.d);
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
alert(textStatus);
alert(errorThrown);
}
});
// Return true to allow default click action.
return true;
};
答案 1 :(得分:0)
如果status = false,您似乎禁用了复选框,但将状态设置为true的唯一方法是检查它。这就是为什么复选框永远不会被检查,即使淘汰赛知道它被点击了。
由于它被禁用,您将无法选中该复选框,因此您必须删除disable: status
数据绑定,或将disable
逻辑放在某个位置,以便您可以实际更改该值的复选框。
答案 2 :(得分:0)
这是因为Knockout中事件处理程序的默认行为是禁用事件的默认操作。在这种情况下,您的click
处理程序就是这样做的。
我建议的解决方案是避免使用click
处理程序并让您的UpdateStatus
作为状态订阅运行。在视图模型构造函数中,您应该添加self.status.subscribe(self.UpdateStatus, self);
另一个解决方案是提及here的解决方案,涉及从true
处理程序返回click
。
答案 3 :(得分:0)
我尝试了here,当UpdateStatus
返回true
时(无法阻止值更改),它可以正常工作,status
显然必须是可观察的值。