1

コレクションのコンテキストで、モデルデータを含むオブジェクトに基づいてモデルインスタンスを取得したいのですが、idAttributeをハードコーディングしたくありません。

バックボーンを使用すると、モデルインスタンスが既にある場合に簡単になり、その.idプロパティにアクセスするだけで整理できますが、モデルのインスタンスを作成する以外に、逆の方法を見つけることができないようです。そので取得しますidAttribute

例えば:

var Cat = Backbone.Model.extend({
  defaults: {
    name: '',
    age: null
  },

  idAttribute: 'name'
});

var PushCollection = Backbone.Collection.extend({
  initialize: function () {
    coll = this;
    somePushConnection.on('deleted', function (deleted) {
      _.each(deleted, function (obj) {
        // obj being something like: {name: 'mittens', age: 302}
        var model = coll.get(obj[coll.model.idAttribute]); // Can't do this!
        if (model) { model.destroy(); }
      });
    });
  }
});

var Cats = PushCollection.extend({
  model: Cat
});
4

2 に答える 2

3

モデルのプロトタイプを介してアクセスできるはずです。

Model.prototype.idAttribute

またはサンプルコードで

var model = coll.get(obj[coll.model.prototype.idAttribute]);
于 2012-12-17T15:04:18.670 に答える
0

質問を誤解しているのかもしれませんが、その方法を使えませんCollection.where()か?

バックボーンのドキュメントから:

どこ collection.where(attributes)

渡された属性に一致するコレクション内のすべてのモデルの配列を返します。フィルターの単純なケースに役立ちます。

var friends = new Backbone.Collection([
  {name: "Athos",      job: "Musketeer"},
  {name: "Porthos",    job: "Musketeer"},
  {name: "Aramis",     job: "Musketeer"},
  {name: "d'Artagnan", job: "Guard"},
]);

var musketeers = friends.where({job: "Musketeer"});

alert(musketeers.length);

したがって、サンプルコードでは:

var PushCollection = Backbone.Collection.extend({
  initialize: function () {
    coll = this;
    somePushConnection.on('deleted', function (deleted) {
      _.each(deleted, function (obj) {
        // obj being something like: {name: 'mittens', age: 302}
        var model = coll.where(obj);
        if (model) { model.destroy(); }
      });
    });
  }
});
于 2012-12-19T20:29:03.510 に答える