2015-07-09 23 views
2

我想追查爲什麼我在observableArray中收到重複條目。有沒有一種方法可以在項目添加到可觀察數組之前訂閱?我可以看到一個項目是通過使用像訂閱後添加:如何在「推送」訂閱之前創建observableArray?

var myArr = ko.observablearray(); 
myArr.subscribe(function (changes) { 
    changes.forEach(function (change) { 
     var item = change.value; 
     var itemStatus = change.status; 
     if (itemStatus === "added") { 

     } else if (itemStatus === "deleted") { 

     } 
    }); 
}, null, "arrayChange"); 
+0

你就不能找到其中數組被修改和調試這些所有的地方? –

回答

2

TL; DR:您可以使用簽名myArray.subscribe(func, null, "beforeChange")


observableArray只是一個observable有額外的屬性,因此,所有subscribe功能正常工作。從the relevant docs

subscribe函數接受三個參數:callback是被調用的函數每當通知發生,target(可選)定義在回調函數的this值,event(可選;默認值是「更改「)是要接收通知的事件的名稱。

...

如果你想被通知可觀察的價值之前,它是即將被改變,你可以訂閱beforeChange事件。

下面是一個例子:

var ViewModel = function() { 
 
    var self = this, i = 1; 
 
    
 
    self.items = ko.observableArray([i++, i++, i++]); 
 
    
 
    self.addItem = function() { self.items.push(i++); }; 
 
    
 
    self.items.subscribe(function(oldValue) { 
 
    alert("Changed from: " + ko.toJSON(oldValue)); 
 
    }, null, "beforeChange"); 
 
    
 
    self.items.subscribe(function(newValue) { 
 
    alert("Changed to this new value: " + ko.toJSON(newValue)); 
 
    }); 
 
}; 
 

 
ko.applyBindings(new ViewModel());
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script> 
 
<button data-bind="click: addItem">Add Item</button> 
 
<ul data-bind="foreach: items"><li data-bind="text: $data"></li></ul>

+0

這正是我所需要的。使用此代碼,然後能夠看到我的問題第一次運行。這個新項目被推向了我忽略的原型。 – Jeff