0

所以我从服务器接收 JSON,看起来像:

{
  data: [
    {
      foo: "hello",
      bar_id: "92934848202"
    },
    {
      foo: "hello again",
      bar_id: "39393020201"
    },
  ]
}

我正在使用映射插件将其读入名为 self.data 的 observableArray 中,例如:

self.data(ko.mapping.fromJS(json).data());

我有另一个名为 bar 的模块,它从服务器读取所有 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 的任何函数都对整个数组而不是该数组中的特定对象进行操作。还有其他建议吗?

4

1 回答 1

1

您将需要分解映射过程并手动添加一个可观察的“bar” - 映射插件允许将 bar_id(或任何其他)可观察对象替换为计算的可观察对象,该可观察对象可以执行您想要的任何操作,但您不能创建数据对象中不存在的属性(例如“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);

http://jsfiddle.net/hTYy3/2/

于 2012-04-07T16:18:34.050 回答