在敲除时不会检查复选框

时间:2012-10-09 08:39:33

标签: javascript asp.net knockout.js

我有一个复选框并单击事件以获取更新数据的复选框。当我单击复选框时,数据正在更新,但未选中复选框。

这是我的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);
        }
    });
};

我希望我的复选框在点击时进行检查。然后在点击复选框后放入更新的数据。

4 个答案:

答案 0 :(得分:22)

http://knockoutjs.com/documentation/click-binding.html

  

注意3:允许默认点击操作
  默认情况下,Knockout将阻止click事件进行任何操作   默认动作。这意味着如果您在a上使用click绑定   例如,标签(链接),浏览器只会调用您的处理程序   功能,不会导航到链接的href。这很有用   默认,因为当你使用点击绑定时,通常是因为   您正在使用该链接作为操纵您的视图的UI的一部分   模型,而不是作为另一个网页的常规超链接。

     

但是,如果您确实要让默认点击操作继续,请执行   从您的点击处理函数返回true

<小时/> 修改添加了示例,显示了在函数中返回true的位置。它必须从实际函数本身返回,而不是Ajax successerror处理程序。

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显然必须是可观察的值。