- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如果您愿意,请考虑一个具有一些独特 View /状态的应用程序 - 让我们将其称为游戏。你有一个主世界屏幕、一个战斗屏幕、一个多人游戏界面,也许还有一两个迷你游戏。
为了便于讨论,每个 View 之间没有太多共同的代码,因此它非常适合 AMD - 中央 Controller /调度程序,并且每个游戏状态分为单独的文件/ View 。
dispatcher.core.js
> overworld.view.js
> battle.view.js
> tournament.view.js
> minigame.view.js
输入和键盘命令被路由到调度程序,并向下渗透到当前事件 View ,后者根据需要操作 DOM。 AMD 的单向关系,到目前为止一切顺利。
我最关心的是响应流程。通过系统的 API 响应数据是多种多样的,通常会同时影响多个 View 。考虑这种情况:
调度程序就是为此而设计的 - 接收指令并分发。这似乎是显而易见的选择,比让观点直接影响彼此要重要得多。
但是,这里存在一个根本缺陷 - 一旦 AJAX 结果从 View 发送到调度程序,调度程序和 View 之间的单向关系就会被破坏。您可以使用 AJAX 回调的调度程序,也可以指示调度程序为您进行 AJAX 调用 - 但无论哪种方式, View 都需要一种引用调度程序的方法,据我所知,这违反了 AMD 的核心原则。对于我的一生,我无法弄清楚如何正确实现!
我的问题是 - 如何正确实现这样的结构?这是 AMD 的限制,还是我在更深层次上误解了它的用途?
<小时/>这个问题旨在针对更多的一般情况,但如果它完全影响答案,我将分别使用 Require 和 jQuery for AMD 和 AJAX。
最佳答案
Is this a limitation of AMD, or am I misunderstanding it's use on a deeper level?
AMD 无论如何都不会在对象实例之间强加单向关系。它强烈建议避免什么(因为即使这也不是绝对要求)是模块之间的循环依赖。对于 AMD 来说重要的依赖项类型是加载依赖项。
您当然可以有一个名为 dispatcher
的模块,它可以:
define(function () {
function Dispatcher(views) {
this.views = views;
for (var ix = 0, view; (view = views[ix]); ++ix)
view.init(this);
}
return Dispatcher;
});
以及viewA
、viewB
,其结构如下:
define(function () {
function View() {
// ...
}
View.prototype.init = function (dispatcher) {
this.dispatcher = dispatcher;
};
// Etc...
return View;
});
你的主模块可以做:
define(['dispatcher', 'viewA', 'viewB'], function (Dispatcher, ViewA, ViewB) {
var viewA = new ViewA();
var viewB = new ViewB();
var dispatcher = new Dispatcher([viewA, viewB]);
});
以上只是一个可能的示意性示例,而不是良好设计的处方。无论如何,重点是,就 AMD 而言,在对象之间进行循环引用是完全可行的。
关于javascript - 了解 AMD : how to handle response flow with a one-way module relationship,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30128196/
我是一名优秀的程序员,十分优秀!