【问题标题】:ko.mapping observableArray always trigger subscriptionko.mapping observableArray 总是触发订阅
【发布时间】:2014-07-11 14:07:55
【问题描述】:

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

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);

【问题讨论】:

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


    【解决方案1】:

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

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

    ko.mapping.fromJS(data, {}, 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

    【讨论】:

    • 也许你是对的,但 observableArrays 上的订阅仅在添加或删除对象时触发,而不是在其属性更改时触发 ...
    • 你必须通过映射代码来验证,但它可能会替换整个数组,我不确定。如果删除第三个参数,则不再触发通知。 jsfiddle.net/xvzAj/1
    • 当然没有触发,因为mappedArray根本没有填充。
    • 我已经用触发订阅通知的 mapping.js 行更新了我的答案。希望现在会更清楚。
    • 是的,现在我明白了你的意思,谢谢,但这并不取决于提供的(或不提供)第三个参数。似乎没有办法在根级别映射数组:它总是会替换整个数组。
    【解决方案2】:

    正如@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");
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-18
      • 2021-04-24
      • 1970-01-01
      相关资源
      最近更新 更多