我正在尝试追踪为什么我在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
的值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>