2

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

我可以像这样在应用程序的事件聚合器中命名事件:

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

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

但我真的不想走那条路。我认为为父模块及其子模块提供单个事件聚合器的想法更清晰。我喜欢从父级到应用程序以及子级到父级的单一接口......但也许我的想法是错误的?

我还可以从 App 对象访问父模块的事件聚合器,如下所示:

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

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

但我也不想那样做。我认为这会将 Child 模块和 App 耦合得太紧。

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

4

2 回答 2

8

不幸的是,虽然 Marionette 让您能够通过属性深入了解应用程序/模块/子模块链submodules,但它并不能轻松访问来识别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)
});
于 2013-09-11T06:03:27.713 回答
-1

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

于 2014-11-08T13:46:40.087 回答