0

我真的很喜欢 Marionette 和它为 Backbone 添加的结构。但是,我对如何在单个页面上重用模块感到有些困惑。

我有一个木偶模块,用于呈现和处理类别树的事件。我想在同一页面上重用这个模块,这将在页面的不同区域显示不同的集合。我开始意识到 Marionette 模块本质上是 Application 对象上的单例,它也是一个单例。我显然无法创建 Module 的新实例来显示和处理不同区域中新集合的事件。同样,我无法在模块上注册和触发事件,因为只有一个,并且每个区域中触发的事件需要相互独立。

我是否错误地考虑了模块?它们如何在具有不同区域/集合的同一页面上重用?

4

2 回答 2

4

将模块视为名称空间。您永远不会尝试复制名称空间,对吗?但是,让命名空间公开代码的其他部分可以创建多个实例的公共类型是很常见的。

App.module('CategoryTree', function(self, App, Backbone, Marionette, $, _) {
   self.Collection = Backbone.Collection.extend( ... );
   self.CollectionView = Marionette.CollectionView.extend( ... );
   ...
});

//elsewhere...
var workingCollection = new App.CategoryTree.Collection( ... );
var workingView = new App.CategoryTree.CollectionView( ... );
var previewCollection = new App.CategoryTree.Collection( ... );
var previewView = new App.CategoryTree.CollectionView( ... );
于 2013-09-10T16:35:25.347 回答
2

编辑我想出了我不喜欢这个...如果您需要显示未知数量的类别树(例如响应 AJAX 调用),那么您已经死在水中了。


我找到了一种似乎可行的潜在解决方案。基本上,模块定义只是一个函数。在将模块添加到应用程序时,我不只使用该函数,而是在全局范围内的其他地方按原样定义函数,以便我可以使用它。

Project.Modules.CategoryTree = function(self, App, Backbone, Marionette, $, _) {
  // ... module definition goes here ...
}

每当我想使用这个模块时,我基本上将它作为子模块添加到现有模块或应用程序中。像这样...

App.module("WorkingTree", Project.Modules.CategoryTree)
App.module("PreviewTree", Project.Modules.CategoryTree)

虽然这确实通过创建两个不同的实例来重用模块代码,但它对我来说并不完全正确。那里有更好的解决方案吗?

于 2013-09-10T16:26:57.633 回答