确定哪些元素的溶液中加入或用Knockoutjs ObservableArray除去(Determi

2019-06-27 11:42发布

我需要弄清楚哪些元素是从我的淘汰赛observableArray删除。 请看看我的jsfiddle 。

我可以订阅的改变,但它只返回值,其是添加或删除后的当前阵列。

self.selectedDataPointOptions.subscribe(function(value) {
  // how can I see which one was added or removed?
  alert(value);
});

Answer 1:

淘汰赛包括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/



Answer 2:

提出的解决方案是凉爽,工作原理,但它涉及到每一个有变化,然后做一个比较,这可能是为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) {
};

...



Answer 3:

麦可思的解决方案(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');
    }
); 


文章来源: Determine which element was added or removed with a Knockoutjs ObservableArray