我有一个带有几个子模块的木偶模块。父模块有自己的事件聚合器,我想在子模块中使用它来触发事件。我知道我可以使用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紧密结合在一起。
还有其他想法或选择吗?也许这些都是好主意,我只是不明白这些好处。
答案 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替换父模块。这样您就可以使用子应用程序事件。