如何在“推送前”订阅时创建observableArray?

时间:2015-07-09 22:39:11

标签: knockout.js

我正在尝试追踪为什么我在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");

1 个答案:

答案 0 :(得分:2)

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

observableArray只是具有额外属性的observable,因此所有subscribe功能都能正常运行。来自the relevant docs

  

subscribe函数接受三个参数:callback是通知发生时调用的函数,target(可选)定义回调中this的值function,event(可选;默认为“change”)是接收通知的事件的名称。

     

...

     

如果您希望在即将更改之前收到可观察值的通知,您可以订阅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>