5

问题。

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

集合需要在模块启动之前准备好。

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

在启动之前加载集合。

这是我想到的第一件事,只需在我调用“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。

4

1 回答 1

1

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

控制器(或路由器)

showUser: function(id) {
   var userModel = new UserModel({id: id});
   userModel.fetch().then(function() {
      mainRegion.show(new UserView({model: userModel}));
   });
}
于 2013-05-30T13:45:24.973 回答