レイアウトの「initialize」メソッドを使用してコレクションをインスタンス化し、そのコレクションの URL からデータをフェッチしてから、フェッチされたデータでコレクションを通過する新しい collectionView をインスタンス化しています。collectionView は後でリージョンに「表示」されます。
それは完全に機能します。
リモートURLからではなく、localStorageを使用してデータを取得することに切り替えたいと思いました。そこで、リモート URL から取得したデータを localStorage に保存しました。次に、「localStorage: new Backbone.LocalStorage('entries')」でコレクションを更新しました。これで、localStorage からデータが正常に取得されます。しかし。レイアウト内のどの領域もレンダリングされません (さまざまな場所で this.render() を呼び出してみましたが、うまくいきませんでした)。
すべてのインスタンス化を担当するレイアウトで「initialize」メソッドを「onRender」に置き換えると、完全にレンダリングされます (リモート URL または localStorage から来たかどうかに関係なく)。
レイアウトの「initialize」メソッドを使用して localStorage からコレクション内のデータをフェッチすると、何もレンダリングされないのはなぜでしょうか。そのデータがリモート Url からフェッチされた場合、それはレンダリングされますか? 「onRender」メソッドを使用すると両方が機能するのはなぜですか?
参照用のコード:
var EntriesCollection = Backbone.Collection.extend({
model: EntryModel,
url: '/api/entries',
localStorage: new Backbone.LocalStorage('entries')
});
return EntriesLayout = Marionette.Layout.extend({
...
// Below, if I use onRender everything works, if I change to 'initialize' then
// it works only when data is loaded via remote url, not localStorage. (the collection
// is successfully populated with data in both cases.)
onRender: function() {
...
this.entries_collection = new EntriesCollection();
var self = this;
this.entries_collection.fetch().done(function() {
/*
self.entries_collection.localStorage = new Backbone.LocalStorage('entries');
self.entries_collection.each(function(model) {
model.save();
});
*/
self.entries_list = new EntriesList({collection: self.entries_collection});
self.collectionSynced();
});
},
collectionSynced: function() {
this.columnRight.show(this.voting_intro);
this.collectionList.show(this.entries_list);
this.listenTo(this.voting_intro, 'start:clicked', function() {
this.displayEntry(0);
});
},
...
私はマリオネットのレイアウト、コレクションビュー、アイテムビューなどを使用していますが、それが質問にとってどれほど重要かはわかりません。