为什么在Mojito中,将controller.server.js重命名为controller.server-foo.js会没有效果?

在Node.js之上的Mojito中,我按照http://developer.yahoo.com/cocktails/mojito/docs/quickstart/上的示例进行操作

我所做的是将 controller.server.js 重命名为 controller.server-foo.js ,并创建了一个新文件 controller.server.js 以显示"Hello World" .

但是当启动mojito时,正在使用旧文件 controller.server-foo.js ,因此不打印"Hello World" . 为什么Mojito会使用旧文件?

(我也尝试将 controller.server-foo.js 重命名为 foo-controller.server.js ,现在打印"Hello World",但为什么使用 controller.server-foo.js ?)

回答(2)

3 years ago

我发现历史上,控制器的"affinity"可以分为两部分 . 第一部分是 commonserverclient ,第二部分是可选的,可能是 tests ,或者其他的话,所以使用其他名称如 controller-not-used-server.js 来禁用它 .

3 years ago

@Charles,mojito有3个注册流程(是的,一开始很混乱):

  • 亲和力(服务器,客户端或通用) .

  • YUI.add创建yui模块(控制器,模型, Binders 等)时

  • 和不太常见的是按名称注册(包括我们称之为选择器的soemthing)

在您的情况下,通过使用两个控制器,其中一个控制器具有名为“foo”的自定义选择器,您可以有效地立即使用3个注册 . 以下是内部发生的事情:

  • 控制器总是从mojit文件夹引爆为"controller" filename,这是按名称注册的一部分,并且由于你有一个控制器的"foo"选择器,你的mojit将具有模式,"default"和"foo" . 将使用哪一个?取决于application.json,您可以在其中设置一些条件来设置"selector"的值,默认情况下为空 . 如果将selector的值设置为"foo",例如,当设备是iphone时,则在该条件匹配时将使用该控制器 .

  • 然后 YUI.add 起着重要的作用,它是我们识别应该使用哪个控制器的方式,它的唯一要求是应用程序中的NO OTHER MODULE可以具有相同的YUI模块名称,这意味着您的控制器不能通过 YUI.add 注册它们时的名称相同 . 而且我确信这就是你的情况 . 如果它们在 YUI.add() 下都具有相同的名称,则一个将始终覆盖另一个,并且您可能应该在日志中看到它作为警告,如果没有,请随时通过github打开问题 .

总结一下:

  • 注册YUI模块时使用的名称必须是唯一的,在您的情况下,您可以使用: YUI.add('MyMojit', function(){})YUI.add('MyMojitFoo', function(){}) ,用于每个控制器 .

  • 使用选择器(例如:controller.server-mobile.js)通过将 selector 设置为 application.json 中的正确值来选择应将哪个YUI模块用于特定请求 .