“帮助”;可扩展JavaScript应用程序体系结构“;
我正在构建一个大型javascript应用程序,并决定使用Nicholas Zakas的可伸缩应用程序架构设计: 根据他的系统,模块是自封装的,彼此不了解。。。然而,在我的项目中,我遇到过许多这样的例子,模块之间似乎有必要相互了解,因为它们本质上是一个更大整体的各个部分 例如。。我有三个模块:上传、窗口和管理器 单击上载选项时,会打开一个带有上载表单的弹出窗口。窗口“管理器”上还有一个链接 单击管理器链接更新弹出窗口以显示管理工具 这对我来说是最有意义的(伪代码): 。。。然而,这与原理背道而驰,因为上传和管理模块专门“请求”窗口模块做一些事情,因此他们知道它 因此,我能想到的唯一其他方法是:“帮助”;可扩展JavaScript应用程序体系结构“;,javascript,design-patterns,publish-subscribe,Javascript,Design Patterns,Publish Subscribe,我正在构建一个大型javascript应用程序,并决定使用Nicholas Zakas的可伸缩应用程序架构设计: 根据他的系统,模块是自封装的,彼此不了解。。。然而,在我的项目中,我遇到过许多这样的例子,模块之间似乎有必要相互了解,因为它们本质上是一个更大整体的各个部分 例如。。我有三个模块:上传、窗口和管理器 单击上载选项时,会打开一个带有上载表单的弹出窗口。窗口“管理器”上还有一个链接 单击管理器链接更新弹出窗口以显示管理工具 这对我来说是最有意义的(伪代码): 。。。然而,这与原理背道
upload module:
upload option click --> sandbox.notification('upload option clicked', [...html markup for form...])
manager module:
manager link click --> sandbox.notification('manager link clicked', [...html markup for admin tools...])
window module:
sandbox.listen('upload option clicked') --> calls createPopUpWindow( passed in html markup )
sandbox.listen('manager link clicked') --> calls createPopUpWindow( passed in html markup )
。。但这感觉不那么直观,老实说,我认为这让我的代码不那么清晰,因为查看上传模块的通知“upload option clicked”(上传选项已点击),根本无法告诉我点击时应该发生什么。。我必须在所有其他文件中查找正在侦听的模块。。。。。我想这可以看作是一个好处,因为多个模块可能希望响应“单击上载选项”,其中“需要弹出窗口”显然只能由一个模块来解决
但是当采用这种方法时,让我的上传模块传递一堆它不知道的与弹出窗口相关的html标记对我来说就没有什么意义了,它开始看起来像是窗口模块应该负责生成标记——但是很多标记是“上传”特定的,并且标记将事件侦听器绑定到upload模块中的函数——因此在窗口模块中使用它并不是真正合乎逻辑的。。。所以它开始变得非常混乱,什么是构建所有这些的最佳方式
我还有另外一种情况,问题更大。。两个模块:轨道和集装箱。容器有很多轨道,最初我只是在容器模块的内部有轨道函数——但是随着模块中的代码长度开始增长,为了干净的代码,我决定将这些分离到它们自己的模块中。。。无论如何,因为容器需要知道它的轨迹,并且能够在内部引用它们,所以我设置它的唯一方法是:
containerObject = function(name) {
this.name = name;
this.video_track = {'name': 'video', 'markup': sandbox.notification('create-track', 'video')}
this.audio_track = {'name': 'audio_1', 'markup': sandbox.notification('create-track', 'audio')}
....etc....
};
因此,Track模块正在执行一个沙盒。listen('create-Track')并将其指向一个函数,该函数返回给定类型的新Track对象。。。。。也许它只是不值得有轨道,因为它是自己的模块。。。。。。因为这是我根据通知调用分配值的唯一地方
我很想听听其他熟悉pub/sub架构的程序员对这个话题有什么看法
请给我你的想法和建议
谢谢。有许多模式处理对象间通信——这就是您真正的问题所在:通信 您的问题可以归纳为:
在这里可以找到一个非常简单的实现,它与本次演讲密切相关:在这篇过去对我非常有用的文章中,我直接链接到N.Zakas和他的团队创建的“为代码提供核心结构的最简JavaScript框架”。几天前,Zakas自己在博客上介绍了这一点。希望这也会有用。
containerObject = function(name) {
this.name = name;
this.video_track = {'name': 'video', 'markup': sandbox.notification('create-track', 'video')}
this.audio_track = {'name': 'audio_1', 'markup': sandbox.notification('create-track', 'audio')}
....etc....
};