2013-12-19 26 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

相關問題