我有一组需要共享相同集合的模块。
在模块启动之前,集合需要准备就绪。
我不确定如何以最干净的方式解决这个问题,我意识到这可能因项目而异,但这里有一些想法。
这是我想到的第一件事,只需加载集合即可 就在我打电话给“App.start()”之前。
然后我可以在全球范围内访问它(不确定我喜欢这个。)。
如果我构建应用程序以使其具有主模块,则负责启动所有子模块。
然后我可以在启动任何子模块之前预先加载所有重要数据,并确保它已准备就绪。
然后可以通过主模块API访问它。
我不知道这是不是很糟糕的设计,我对木偶的经验是有限的。
Atm我选择在“App.start()”之前加载这些集合,这使得它产生了感觉 我也在预加载我的模板。
我引入了一个名为'CollectionManager'的'静态'对象,它充当我的集合的代理/访问点。并将在全球范围内提供。
// Templates that should be ready on start up
var arrTemplatesPaths = [...];
// Collections that i need to be ready and shared between modules.
var arrSharedCollections = [
{id:"groups", collection: GroupCollection}
];
// Preloading the vital data.
$.when.apply(null, [
Templates.fetch(arrTemplatesPaths),
CollectionManager.fetch(arrSharedCollections)
])
.then(function(){
App.start();
})
然后需要访问集合的模块才能调用 CollectionManager.get(id)
var collection = CollectionManager.get("groups"); //@return Backbone.Collection
这提供了一些结构,但我不确定我是否喜欢它。
所以在Marionette doc中挖了一点之后我发现了Marionette.RequestResponse。
这提供了一种从模块内部请求数据的简洁方法,从而创建了一个 我的方法的抽象程度,以令人讨厌的方式耦合事物。
所以我已将此行添加到应用程序中:
App.reqres.addHandler("getCollection", function (id) {
return CollectionManager.get(id);
})
然后从模块中我以这种方式访问集合:
var collection = App.request("getCollection", "groups")
我喜欢这种方式,然后直接从模块中访问CollectionManager。
答案 0 :(得分:1)
关于在显示视图之前或之后加载集合/模型的主题,我发现最好的方法是在Marionette控制器中获取模型/集合,然后显示视图,传入模型/集合被抓了。看起来像这样:
控制器(或路由器)
showUser: function(id) {
var userModel = new UserModel({id: id});
userModel.fetch().then(function() {
mainRegion.show(new UserView({model: userModel}));
});
}