ko.mapping observableArray总是触发订阅

时间:2014-07-11 14:07:55

标签: javascript knockout.js knockout-mapping-plugin ko.observablearray

我正在使用ko.mapping插件来映射来自ajax请求的数据。 设置密钥我希望在这种情况下不会触发订阅,但它始终会被提升;我不明白为什么。 Thx提前。

var arraySource = [{ Prop: 1, Prop2: 1 }, { Prop: 2, Prop2: 2 }];
var mappedArray = ko.observableArray([]);
mappedArray.subscribe(function (data) {
    console.log(data);
});
window.setInterval(function () {
    ko.mapping.fromJS(arraySource, {
        key: function (data) {
            return data.Prop;
        }
    }, mappedArray);
}, 3000);

2 个答案:

答案 0 :(得分:1)

演示:http://jsfiddle.net/xvzAj/

根据文档中的注释,听起来将第三个参数传递给.fromJS会覆盖会触发通知的数组属性。

  

ko.mapping.fromJS(data,{},someObject); //覆盖属性   someObject

来源:http://knockoutjs.com/documentation/plugins-mapping.html

在knockout.mapping.js ln 627中,替换了触发订阅通知的数组内容。

mappedRootObject(newContents);

https://github.com/SteveSanderson/knockout.mapping/blob/master/build/output/knockout.mapping-latest.debug.js

答案 1 :(得分:0)

正如@Andrew Walters所建议的那样,订阅将始终被触发,因为整个数组都会被新内容覆盖。 通过阅读淘汰赛第3版,我发现了一种识别真正改变的方法:http://blog.stevensanderson.com/2013/10/08/knockout-3-0-release-candidate-available/

var myArray = ko.observableArray(["Alpha", "Beta", "Gamma"]);

myArray.subscribe(function(changes) {
    // For this example, we'll just print out the change info
    console.log(changes);
}, null, "arrayChange");

在订阅中,可以非常简单的方式获取添加,删除和保留的元素!