在knockout.js中创建has_one类型关系

时间:2012-04-07 15:30:58

标签: javascript knockout.js

所以我从服务器接收的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的任何函数都在整个数组上运行,而不是该数组中的特定对象。还有其他建议吗?

1 个答案:

答案 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);

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