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紧密结合在一起.
还有其他想法或选择吗?也许这些是好主意,我只是不明白其中的好处.
不幸的是,虽然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)