无法使用knockout映射插件加载字典

时间:2014-06-19 17:36:12

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

我找到了解决方案如何在http://jsfiddle.net/karlhorky/D4D3f/

上使用observable数组作为字典
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/

1 个答案:

答案 0 :(得分:1)

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

因此,当您的indexBy引用keyName时,您需要处理ko.observable

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

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