所以我从服务器接收的JSON类似于:
{
data: [
{
foo: "hello",
bar_id: "92934848202"
},
{
foo: "hello again",
bar_id: "39393020201"
},
]
}
我正在使用映射插件将其读入一个名为self.data的observableArray:
self.data(ko.mapping.fromJS(json).data());
我有另一个名为bar的模块,它从服务器读取所有条形及其ID。我在bar中有一个方法,它能够使用名为find的方法返回一个对象。所以
bar.find("39393020201") // returns object
但我真正想做的是让self.data observableArray能够通过以下方式直接访问bar:
self.data()[0].bar // ideally returns object?
我迄今为止最接近的是添加这样的自定义函数:
ko.observable.fn.bar = function() {
return bar.find(this());
};
但是这个我称之为
的要求self.data()[0].bar_id.bar
这不是很漂亮。但是我添加到observableArray的任何函数都在整个数组上运行,而不是该数组中的特定对象。还有其他建议吗?
答案 0 :(得分:1)
您需要分解映射过程并手动添加一个可观察的“条形图” - 映射插件允许用计算的observable替换bar_id(或任何其他)observable,它可以执行您想要的任何操作,但是您可以不要创建数据对象中不存在的属性(例如“bar”)。
var tmp = [];
for (var i = 0; i < json.data.length; i++) {
// Map only one object in the json.data array
var o = ko.mapping.fromJS(json.data[i]);
// Add a computed observable that turns bar_id into bar
o.bar = ko.computed(function() {
return self.bar.find( o.bar_id() );
});
tmp.push(o);
}
self.data(tmp);