0

したがって、サーバーから次のような JSON を受信して​​います。

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

次のようなマッピング プラグインを使用して、self.data という observableArray に読み込んでいます。

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

バーと呼ばれる別のモジュールがあり、サーバーからすべてのバーを ID と共に読み取ります。find と呼ばれるメソッドでオブジェクトを返すことができるメソッドが bar にあります。そう

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_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 に答える