我正在使用布局的“初始化”方法来实例化一个集合,从该集合上的一个 url 中获取()数据,然后实例化一个新的 collectionView,该集合视图使用它获取的数据通过该集合。collectionView 稍后会在一个区域中“显示”。
它完美地工作。
我想切换到使用 localStorage 来检索数据,而不是从远程 url。所以我将从远程 url 检索到的数据保存到 localStorage。然后我用'localStorage:new Backbone.LocalStorage('entries')'更新了集合。现在它成功地从 localStorage 检索数据。但。布局中的任何区域都没有被渲染(我试过在不同的地方调用 this.render() 没有运气)。
如果我在负责实例化所有内容的布局中将“initialize”方法替换为“onRender”,那么它会完美呈现(无论它来自远程 url 还是 localStorage)。
为什么如果我使用布局的“初始化”方法从 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);
});
},
...
我正在使用 Marionette 的 Layout、CollectionView、ItemView 等,不确定这对问题有多重要。