12

我有一个复选框绑定到视图模型上的可观察对象。我需要基本上弹出一个“你确定吗?” 如果用户将其从 true 更改为 false,则确认提示。我很难找到使更改“可取消”的最佳位置。. .

1) 单击事件的 jQuery 处理程序 2) Viewmodel 内部订阅“beforeChange” 3) Viewmodel 内部订阅(正常)

无论如何,我更愿意有机会彻底取消更改,而不是对更改做出反应,如果需要,可能会将其恢复到以前的值。

Knockout 的订阅事件是否让您有机会取消更改?任何见解将不胜感激。谢谢!

4

2 回答 2

22

这是一个使用 jQuery 的 stopImmediatePropagation 的简单选项:

http://jsfiddle.net/rniemeyer/cBvXM/

<input type="checkbox" data-bind="click: confirmCheck, checked: myvalue" />

js:

var viewModel = {
    myvalue: ko.observable(false),
    confirmCheck: function(data, event) {
        if (!confirm("Are you sure?")) {
            event.stopImmediatePropagation();            
            return false;
        }
        return true;
    }
};
于 2012-05-14T16:28:05.493 回答
15

由于@RP Niemeyer 回答中评论的问题,我刚刚实现了这个扩展器:

ko.extenders.confirmable = function(target, options) {
    var message = options.message;
    var unless = options.unless || function() { return false; }
    //create a writeable computed observable to intercept writes to our observable
    var result = ko.computed({
        read: target,  //always return the original observables value
        write: function(newValue) {
            var current = target();

            //ask for confirmation unless you don't have
            if (unless() || confirm(message)) {
                target(newValue);
            } else {
              target.notifySubscribers(current);
            }
        }
    }).extend({ notify: 'always' });

    //return the new computed observable
    return result;
};

然后,您可以将其应用于您的模型,如下所示:

var viewModel = {
    myvalue: ko.observable(false).extend({confirmable: "Are you sure?"});
}

而且,如果有不要求确认的情况(在这个愚蠢的例子中,我们将在 3 月跳过确认),你可以这样做:

var viewModel = {
    myvalue: ko.observable(false).extend({confirmable: { message: "Are you sure?", unless: function() { return new Date().getMonth() == 2 }} });
}
于 2014-01-31T14:40:29.403 回答