0

ローカル バックボーン コレクションがあります。

var collection = new Backbone.Collection([ { greeting: "hi" }, { greeting: "bye" } ]);

collection.fetchを実行すると、Backbone が結果に対して実行されることを理解してcollection.setいます。ただし、サーバーからの応答をマージする必要があります。応答は次のようになります。

[ { id: "2", greeting: "hi", name: "Bob" } ]

マージ後の結果のコレクションを次のようにしたいと思います。

[ { id: "2", greeting: "hi", name: "Bob" }, { greeting: "bye" } ]

ここで Backbone が既にいくつかのマージを試みていることは理解していますが、set上記の応答例の場合、マージは行われず、代わりに新しいモデルが追加されます。これは によってマージされるためだと思いますが、ここでは(ローカル コレクションに) sidがありません。idこの場合、greetingは私の一意の識別子/キーです。

greeting私がこれをやろうとしている理由は、ローカル コレクションがあり、そのコレクションから (キーを使用して) 既に存在するものを確認し、調査結果をマージしたいだけだからです。

4

2 に答える 2

1

私の解決策:

feeds.fetch({
  add: false,
  remove: false,
  merge: false,
  data: params,
  success: function (feeds, response) {
    // Merge any matches
    _.each(response.results, function (result) {
      _.each(feeds.models, function (feed) {
        // We have to `parse` the result before setting it, as Model#set does
        // not automatically run `parse` (Collection#set does).
        result = feed.parse(result)
        if (feed.get('rssUrl') === result.rssUrl) feed.set(result)
      })
    })
    cb(feeds)
  }
})
于 2013-04-11T23:21:27.027 に答える
1

モデルの id 属性に別のキーを使用するようにバックボーンに指示できます。

GreetingModel = Backbone.Model.extend({
  idAttribute: "greeting"
});

GreetingCollection = Backbone.Collection.extend({
  model: GreetingModel
});

http://backbonejs.org/#Model-idAttribute

編集:ローカル側とサーバー側に2つの別々のコレクションを使用できると思います。

var localCollection = new Backbone.Collection([ { greeting: "hi" }, { greeting: "bye" } ]);

ServerCollection = Backbone.Collection.extend({
  url: "/api/"
  ...
});

var serverCollection = new ServerCollection({});

serverCollection.on("reset", function() {   
    localCollection.each(function(localModel) {
        var greeting = localModel.get("greeting");
        serverModel = serverCollection.findWhere({greeting: greeting});
        if(serverModel) {
            localModel.set(serverModel.attributes);          
        } 
    });
});

serverCollection.fetch();
于 2013-04-11T23:03:28.070 に答える