我正在使用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);
答案 0 :(得分:1)
根据文档中的注释,听起来将第三个参数传递给.fromJS
会覆盖会触发通知的数组属性。
ko.mapping.fromJS(data,{},someObject); //覆盖属性 someObject
来源:http://knockoutjs.com/documentation/plugins-mapping.html
在knockout.mapping.js ln 627中,替换了触发订阅通知的数组内容。
mappedRootObject(newContents);
答案 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");
在订阅中,可以非常简单的方式获取添加,删除和保留的元素!