7

我对数组进行了更改。我正在使用 Sanderson 最新的数组订阅方法来捕获添加/删除更改。在此订阅中,我打算捆绑并通过网络发送我的请求。如果请求因任何原因失败,我希望能够取消对集合的任何可能更改。我已验证此订阅在更改传播之前已被命中,因此我认为会有一种方法可以说“停止不要这样做”,但我不知道如何。

作为我的例子...

self.SourceData = ko.observableArray(data);
self.SourceData.subscribe(function(changes) {
    var isAllGood = true;
    ko.utils.arrayForEach(changes, function(ch) {
        if (ch.value == doesNotMeetMyCondition) isAllGood = false;
    });
    if (!isAllGood) <STOP DON'T DO IT>
}, null, 'arrayChange');

在检查“this”时,我确实看到了带有标准 [callback, dispose, disposeCallback, target] 的 ko.subscription 对象,但似乎没有什么相当于 STOP DON'T DO IT。

任何想法都会很有帮助。谢谢。

4

2 回答 2

4

目前没有办法阻止更改进行。

您可能会订阅beforeChange事件并在更改之前缓存数组的副本。就像是:

self.SourceData.subscribe(function(value) {
    /store copy, in case it needs to be restored
    self.beforeSourceData = value && value.slice();
}, null, "beforeChange");
于 2013-12-19T21:13:31.470 回答
2

您可以使用另一种方法 - 创建扩展程序来验证您的阵列的变化。我创建了一个简化的示例来检查指定上边界的简单整数数组。小提琴: http: //jsfiddle.net/pkutakov/n2APg/1/ 代码:

ko.extenders.checkValue=function (value, condition){
    var result=ko.computed({
        read: value,
        write: function (newValue){
            var current=value();
            var canSave=true;
            ko.utils.arrayForEach(newValue, function(ch) {
                if (ch>condition)
                    canSave=false;
            });
            if (canSave)
            {
                value(newValue);
                value.notifySubscribers(newValue);
            }
            else
                value.notifySubscribers(value());
        }
    }).extend({ notify: 'always'});
    result(value());

    //return the new computed observable
    return result;
}

function AppViewModel(data)
{
    self=this;
    self.Data=ko.observableArray(data).extend({ checkValue: 100});
}

var mydata=[10, 11];
ko.applyBindings(new AppViewModel(mydata));
于 2013-12-20T08:06:37.350 回答