【发布时间】:2012-07-31 12:54:00
【问题描述】:
我有一个包含三个页面的应用程序(它们是单页界面)。这些页面具有相似但不相同的功能。
所以我想要提供通用功能的 javascript 模块。然后每个页面都可以自定义/覆盖部分通用功能。
我正在使用backbone.js,所以我要做的是:
- 加载包含常见模型、视图、集合等的文件。
- 加载自定义/覆盖第 1 步部分的应用特定文件
- 调用一个 init() 函数来实例化所有必要的模型/视图/集合
目前,我将模块存储在类似于以下内容的模块容器中:https://stackoverflow.com/a/9426071 每个模块都有一个可选的 init() 函数,由我的主 init() 函数执行。
例子:
-
我有一个名为 results.js 的文件。它定义了搜索结果的通用模型/集合/视图。在它的 init() 函数中,一切都被实例化了,但是这个函数还没有被调用:
var resultView = new ResultView() 然后我包含 myApp.js,部分视图被覆盖。
- 主 init() 函数调用 results.js init() 实例化新视图。一切正常、顺畅、干燥。
现在我想切换到 require.js 而不是我自己的模块容器,想知道如何组织我的代码。
我可以在 myApp.js 中实例化所有模型/视图等,而不是每个模块的 init() 函数。这意味着有很多重复的代码。
或者我可以坚持每个模块都有它的 init() 函数,并在 myApp.js 中调用这些 init() 函数。我不喜欢这样,因为我必须为我的三个页面中的每一页明确写下我的模块三次:
require(['module1', 'module2', 'module3', ...],
function(module1, module2, module3, ...) {
var init = function() {
module1.init();
module2.init();
module3.init();
...
}
return {init: init};
}
);
对于 10 个模块和一些库,这不是很好而且很枯燥。有什么方法可以访问(循环) require.js 拥有的所有模块?
或者我遗漏了什么,我应该以不同的方式构建我的代码吗?
欢迎任何提示/想法,
迈克尔
【问题讨论】:
-
你有没有想过在你的回调中简单地循环
arguments并调用init()(如果存在)? -
究竟是哪个
arguments?如果你的意思是:function(module1, module2, module3, ...) {我如何在不明确命名的情况下循环它们? -
就是这样 -
argumentsobject 是function的内置属性,它是传递给函数的所有参数的数组。对于 require.js,您知道收到的参数将与您作为依赖项提供的模块定义完全匹配。 -
您刚刚提高了我对 JavaScript 的了解,谢谢!
arguments似乎是一个非常基本的东西,我想知道我怎么从来没有读过它。这样我什至可以明确地为模块命名一次,非常好。 -
@JohnMunsch 谢谢,我会把它作为答案发布!
标签: javascript backbone.js requirejs js-amd