これは、処理する「バックボーン」の方法があるかどうかよくわからない一般的なシナリオの 1 つです。ここに1つの可能な解決策があります...
ドキュメント コレクション ( ) をフェッチすると、次の/api/documents
ような json が返されます。
[{id: 1, name: 'foo'}, {id: 2, name: 'bar'}]
ドキュメント ( ) を取得すると、次の/api/documents/1
ような json が返されます。
{
id: 1, name: 'foo', description: 'some stuff about foo',
articles: [{id: 1, name: 'hello'}, {id: 2, name: 'hi again'}]
}
個々の DocumentModel がフェッチされると、新しい属性がありますarticles
。change:articles
イベントをリッスンし、ArticlesCollection が含まset
れる新しい json をリッスンします。this.articles
今...いくつかのコード:
var Article = Backbone.Model.extend({});
var ArticleCollection = Backbone.Collection.extend({
model: Article
});
var Document = Backbone.Model.extend({
constructor: function() {
// make sure articles collection is created.
this.articles = new ArticleCollection();
Backbone.Model.prototype.constructor.apply(this, arguments);
},
initialize: function(attributes, options) {
this.articlesChanged();
this.on('change:articles', this.articlesChanged, this);
},
// articles attribute changed.
// set it into the Collection.
// this way, existing models will be updated, new ones added.
articlesChanged: function(){
// if document was fetched and has articles json array,
// set that json into this.articles collection.
var articles = this.get('articles');
if(articles){
this.articles.set(articles);
// remove 'articles' attribute now that it is set into the collection.
this.unset('articles');
}
}
});
var DocumentCollection = Backbone.Collection.extend({
model: Document
});
いくつかのコード:
var docs = new DocumentCollection();
docs.fetch().done(function() {
// docs now has documents with only name, date attributes,
// and empty articles collection.
var doc = docs.at(0);
var name = doc.get('name'); // foo
var articleCount = doc.articles.length; // 0
doc.fetch().done(function() {
// first doc is now full, with articles, description, etc.
doc.articles.each(function(article) {
console.log(article.get('name'));
}, this);
// re-fetch the collection later... to check if new documents exist.
docs.fetch().done(function() {
// new docs added, removed docs gone.
// existing doc models updated.
});
});
});
これについて私が気に入っている主な点は、ドキュメント コレクションまたは個々のドキュメントが後で再取得された場合でも、ドキュメント/記事コレクションのインスタンスが保持されることです。
したがって、たとえば、DocumentModel とその記事コレクションを詳細ビューに表示していて、DocumentCollection 全体が再フェッチされた場合、表示されている DocumentModel はフェッチ後もコレクションに残ります (実際に削除されない限り)。サーバ)。change add remove
これらのインスタンスにいくつかの型イベントが接続されている場合、これは便利です。
Backbone 1.0 が 'update' fetch に移行したことで (これは素晴らしいことです)、他に (またはより良い) 解決策があるかどうか知りたいです。この正確なソリューションを多く使用しましたが、それが理想的かどうかはわかりません。parse
以前は子jsonと子コレクションを取得するためにもっと使用していreset
ました..しかし、フェッチの更新でいくつかの問題に遭遇したと思うので、これを試し始めました。