【问题标题】:Can't load dictionary using knockout mapping plugin无法使用敲除映射插件加载字典
【发布时间】:2014-06-19 17:36:12
【问题描述】:

我在http://jsfiddle.net/karlhorky/D4D3f/找到了如何使用可观察数组作为字典的解决方案

ko.observableArray.fn.indexBy = function (keyName) {
    var index = ko.computed(function () {
        var list = this() || [];
        var keys = {}; 
        ko.utils.arrayForEach(list, function (v) {
            if (keyName) {          
                keys[v[keyName]] = v;   
            } else {
                keys[v] = v;
            }
        });
        return keys;
    }, this);

    this.findByKey = function(key) {
        return index()[key];  
    };

    return this;
};

我想使用映射插件将数据加载到字典

this.Load = function () {
    //this.items.
    var mapping = {
        'copy': ["Qid"]
    };
    ko.mapping.fromJS(data, mapping, this.items);
    count = 0;
};

但无法通过使用映射插件加载的关键数据进行搜索

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

【问题讨论】:

    标签: dictionary knockout.js knockout-mapping-plugin


    【解决方案1】:

    映射插件将常规属性转换为可观察属性。

    因此,在您的indexBy 中,当您的keyName 引用ko.observable 时,您需要处理这种情况。

    当您使用v[keyName] 获取关键属性值时,您需要使用ko.utils.unwrapObservable(或ko.unwrap,如果您使用较新版本的KO)以确保正确解包您的可观察属性:

    ko.observableArray.fn.indexBy = function (keyName) {
        var index = ko.computed(function () {
            var list = this() || [];
            var keys = {};
            ko.utils.arrayForEach(list, function (v) {
                if (keyName) {
                    keys[ko.utils.unwrapObservable(v[keyName])] = v;
                } else {
                    keys[v] = v;
                }
            });
            return keys;
        }, this);
    
        this.findByKey = function (key) {
            return index()[key];
        };
    
        return this;
    };
    

    演示JSFiddle.

    【讨论】:

      猜你喜欢
      • 2014-01-21
      • 2012-04-13
      • 2013-06-01
      • 2023-03-29
      • 1970-01-01
      • 2013-03-03
      • 2012-11-18
      • 2022-09-27
      • 2014-06-06
      相关资源
      最近更新 更多