我需要弄清楚哪些元素是从我的淘汰赛observableArray删除。 请看看我的jsfiddle 。
我可以订阅的改变,但它只返回值,其是添加或删除后的当前阵列。
self.selectedDataPointOptions.subscribe(function(value) {
// how can I see which one was added or removed?
alert(value);
});
我需要弄清楚哪些元素是从我的淘汰赛observableArray删除。 请看看我的jsfiddle 。
我可以订阅的改变,但它只返回值,其是添加或删除后的当前阵列。
self.selectedDataPointOptions.subscribe(function(value) {
// how can I see which one was added or removed?
alert(value);
});
淘汰赛包括ko.utils.compareArrays
,你可以用一个阵列数据进行比较。 下面是用于通知所述阵列中的每个增加或移除项的辅助函数:
ko.observableArray.fn.subscribeArrayChanged = function(addCallback, deleteCallback) {
var previousValue = undefined;
this.subscribe(function(_previousValue) {
previousValue = _previousValue.slice(0);
}, undefined, 'beforeChange');
this.subscribe(function(latestValue) {
var editScript = ko.utils.compareArrays(previousValue, latestValue);
for (var i = 0, j = editScript.length; i < j; i++) {
switch (editScript[i].status) {
case "retained":
break;
case "deleted":
if (deleteCallback)
deleteCallback(editScript[i].value);
break;
case "added":
if (addCallback)
addCallback(editScript[i].value);
break;
}
}
previousValue = undefined;
});
};
这是在行动: http://jsfiddle.net/mbest/Jq3ru/
与淘汰赛3.0开始,您可以使用arrayChange
事件更容易做到这一点。 更多信息是在这里: http://blog.stevensanderson.com/2013/10/08/knockout-3-0-release-candidate-available/
提出的解决方案是凉爽,工作原理,但它涉及到每一个有变化,然后做一个比较,这可能是为O(n ^ 2)一次性克隆数组。
这里是另一种解决方案:它意味着包括另一个js文件...但是,如果你想一些更好的性能,这将提供它:
https://github.com/bobwold/betterObservableArray
这种替代observableArray(这基本上是一个可观察到的阵列的克隆,带有一些额外的代码)采用淘汰赛订阅框架,并增加了“添加”和“删除”订阅。
用法示例:
var presidents = ko.betterObservableArray();
presidents.subscribe(presidentAdded, this, "add");
presidents.subscribe(this.presidentRemoved, this, "remove");
...
function presidentAdded(president) {
};
function presidentRemoved (president) {
};
...
麦可思的解决方案(subscribeArrayChanged)都非常好,我也一样。 但是,我需要从打字稿使用它,为此我写了一个小定义源(d.ts),在不同的源从原来的“knockout.d.ts”对于在打字稿源代码一个舒适的方式使用它。
定制knockoutext.d.ts文件:
/// <reference path="knockout.d.ts" />
interface KnockoutObservableArray<T> extends KnockoutObservableArrayFunctions<T> {
subscribeArrayChanged(addCallback: (T) => void , deleteCallback: (T) => void );
}
小样本代码片段:
data[0].Properties.subscribeArrayChanged(
(value: Meta.Data.Property) => {
console.log('add callback called');
},
(value: Meta.Data.Property) => {
console.log('delete callback called');
}
);