模块之间的共享集合

时间:2013-03-25 11:32:57

标签: marionette

问题。

我有一组需要共享相同集合的模块。

在模块启动之前,集合需要准备就绪。

我不确定如何以最干净的方式解决这个问题,我意识到这可能因项目而异,但这里有一些想法。

在启动前加载集合。

这是我想到的第一件事,只需加载集合即可 就在我打电话给“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。

1 个答案:

答案 0 :(得分:1)

关于在显示视图之前或之后加载集合/模型的主题,我发现最好的方法是在Marionette控制器中获取模型/集合,然后显示视图,传入模型/集合被抓了。看起来像这样:

控制器(或路由器)

showUser: function(id) {
   var userModel = new UserModel({id: id});
   userModel.fetch().then(function() {
      mainRegion.show(new UserView({model: userModel}));
   });
}