8

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

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

4 回答 4

25

请参阅:http : //knockoutjs.com/documentation/click-binding.html

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

但是,如果您确实想让默认点击操作继续进行,只需从您的点击处理函数返回 true


编辑:true添加了显示函数中返回位置的示例。它必须从实际函数本身返回,而不是 Ajaxsuccesserror处理程序。

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;
};
于 2012-10-09T08:59:18.773 回答
0

这是因为 Knockout 中事件处理程序的默认行为是禁用事件的默认操作。在这种情况下,您的click处理程序会这样做。

我推荐的一个解决方案是避免使用click处理程序并将您的UpdateStatus运行作为对状态的订阅。在您的视图模型构造函数中,您应该添加self.status.subscribe(self.UpdateStatus, self);

另一种解决方案是这里提到的涉及true从您的click处理程序返回的解决方案。

于 2012-10-09T08:51:57.333 回答
0

如果status = false,您似乎正在禁用复选框,但将status设置为true的唯一方法是检查它。这就是为什么即使淘汰赛知道它已被点击,复选框也不会被选中的原因。

由于它被禁用,您将无法选中复选框,因此您必须删除disable: status数据绑定,或将disable逻辑放置在某个位置,以便您可以实际更改复选框的值。

于 2012-10-09T08:44:54.900 回答
0

我在这里UpdateStatus尝试过,它在返回时起作用true(不阻止值更改)并且status显然必须是一个可观察的值。

于 2012-10-09T09:00:24.683 回答