来自子模块的JavaScript事件通知

来自子模块的JavaScript事件通知,javascript,design-patterns,notifications,Javascript,Design Patterns,Notifications,当前使用显示顶部模块的模块模式。主JS模块为应用程序提供注册事件的接口。现在库中有了带有名称空间的子模块 例如: Main = (function() { function on(event, fn) { ....; } }()); Main.level1 = (function() { function level1() { } level1.prototype.dothis = function() { ....;

当前使用显示顶部模块的模块模式。主JS模块为应用程序提供注册事件的接口。现在库中有了带有名称空间的子模块

例如:

Main = (function() {
    function on(event, fn) {
        ....;
    }
}());

Main.level1 = (function() {
    function level1() {
    }

    level1.prototype.dothis = function() {
        ....;
    }

    return level1;
}());
以及一个子模块,如下所示

Main.level1.level2 = (function() {
    function level2() {
    }

    level2.prototype.dothis = function() {
        ....;
    }

    return level2;
}());
现在,如果子模块level2中的代码想要发出/触发一个事件,那么如何才能做到这一点?一种优雅的方式是主模块和子模块level1公开一个公共api,每当level2想要向应用程序发出事件时,就会调用该api。但这确实是一种设计库/模块的糟糕方法。有更好的方法吗


更清楚地说-当使用显示模块模式和跨多个文件使用子模块时,我们如何处理事件通知?

为什么您认为
emit
方法不美观或设计不好?如果您不想嵌套模块定义,您不能拥有私有API。@Bergi:我不认为'emit'是不美观,而是必须有一个公共API的概念,该API仅用于通过子模块触发事件。虽然公共API意味着要被更高的应用程序消耗。一个用于消费者,一个用于子模块。“注册子模块”,无论通过何种方式,始终需要是一个公共的“API”anyway@Bergi:谢谢你的回复,非常感谢。让我看看是否有人对此有其他意见。