2013-12-19 19 views
7

我对数组发生了变化。我正在使用Sanderson的最新数组订阅方法来捕获添加/删除更改。在此订阅中,我打算通过电汇捆绑并发送我的请求。如果请求因任何原因失败,我希望能够取消对集合的任何可能更改。我已经证实,这个订阅是在变化传播之前被击中的,所以我认为会有一种说法“停止不做”的方式,但我无法弄清楚。如何取消对具有Knockout 3.0的可观察数组的更改?

作为我的榜样......

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'); 

当检查“这个”我看到的标准的ko.subscription对象[回调,处置,disposeCallback,目标]但似乎没有达到STOP DON '做吧。

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

+0

您订阅方法调用,当你observableArray已经改变(增加或删除的项目),是吗?如果它是真的,也许你应该添加两个方法添加/删除,并在其中进行验证? – alexmac

回答

4

目前还没有办法阻止变更。

您可能会订阅beforeChange事件并在更改之前缓存数组副本。例如:

self.SourceData.subscribe(function(value) { 
    /store copy, in case it needs to be restored 
    self.beforeSourceData = value && value.slice(); 
}, null, "beforeChange"); 
+0

是的,这与我目前的处理方式并不相同。我确实喜欢将我的请求保留到直接附加到我在发送更改时发送的对象更改的服务器上的想法。感谢您花点时间分享这个想法。 – beauXjames

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)); 
+0

非常好用的扩展器来改变输入。我做了一些相同的订阅逻辑来测试发生的顺序事件。实际上,我发现扩展程序确实发生在订阅之前,但是返回到订阅的“更改”现在没有3.0更改检查方法。 http://jsfiddle.net/n2APg/4 – beauXjames

+0

我修改了小提琴:http://jsfiddle.net/n2APg/5/ – BenjiFB

+0

它只是添加一行:myVM.Data.push(13); – BenjiFB

相关问题