问题。
我有一组需要共享相同集合的模块。
集合需要在模块启动之前准备好。
我不确定如何以最干净的方式解决这个问题,我意识到这可能因项目而异,但这里有一些想法。
在启动之前加载集合。
这是我想到的第一件事,只需在我调用“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 文档中挖掘了一下之后,我注意到了Marionette.RequestResponse。
这提供了一种从模块内请求数据的干净方式,在我的方法上创建了一个抽象级别,以一种令人讨厌的方式耦合事物。
所以我在应用程序中添加了这一行:
App.reqres.addHandler("getCollection", function (id) {
return CollectionManager.get(id);
})
然后从模块中我以这种方式访问集合:
var collection = App.request("getCollection", "groups")
我更喜欢这种方式,而不是直接从模块中访问 CollectionManager。