使用Marionette从子模块访问父模块的最佳方法

时间:2013-09-10 23:11:38

标签: javascript backbone.js marionette

我有一个带有几个子模块的木偶模块。父模块有自己的事件聚合器,我想在子模块中使用它来触发事件。我知道我可以使用Application的事件聚合器,但这些事件特定于父模块及其子节点,而不是整个应用程序。

我可以命名应用程序的事件聚合器中的事件,如下所示:

App.module("Parent.Child", function(self, App, ...) {

  // somewhere in the child
  App.vent.trigger("Parent:something");
});

但我真的不想走那条路。我认为为父模块及其子模块设置单个事件聚合器的想法更清晰。我喜欢从Parent到Application的单一界面,以及从Child到Parent的界面......但也许我在这个想法中错了?

我也可以从App对象获取Parent Module的事件聚合器,如下所示:

App.module("Parent.Child", function(self, App, ...) {

  // somewhere in the child...
  App.Parent.vent.trigger("something");
});

但我也不愿意这样做。我认为这会将Child模块和App紧密结合在一起。

还有其他想法或选择吗?也许这些都是好主意,我只是不明白这些好处。

2 个答案:

答案 0 :(得分:8)

不幸的是,虽然Marionette让您能够通过submodules属性向下钻取app / module / submodule链,但它无法轻松识别Module的父级。我们曾经遇到过几次这可能会有所帮助,但从未遇到过没有成为问题的情况。也就是说,如果您认为它会使您的代码库更清晰,您可以尝试包装_addModuleDefinition函数来创建parent属性:

var func = Marionette.Module._addModuleDefinition;
Marionette.Module._addModuleDefinition = function(parentModule, module) {
    module.parent = parentModule;
    func.apply(this, arguments);
};

这将使您能够执行类似

的操作
App.module("Parent.Child", function(self, App, ...) {
    self.parent.trigger('whatever'); // (vent isn't required anymore)
});

答案 1 :(得分:-1)

您可以使用subapp替换父模块。这样您就可以使用子应用程序事件。