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

Dav*_*ehl 2 javascript backbone.js marionette

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

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

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

  // somewhere in the child
  App.vent.trigger("Parent:something");
});
Run Code Online (Sandbox Code Playgroud)

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

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

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

  // somewhere in the child...
  App.Parent.vent.trigger("something");
});
Run Code Online (Sandbox Code Playgroud)

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

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

Chr*_*tta 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);
};
Run Code Online (Sandbox Code Playgroud)

这会让你有能力做类似的事情

App.module("Parent.Child", function(self, App, ...) {
    self.parent.trigger('whatever'); // (vent isn't required anymore)
});
Run Code Online (Sandbox Code Playgroud)