我找到了解决方案如何在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;
};
但无法使用映射插件加载的关键数据进行搜索
答案 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。