4

我有一个包含三页的应用程序(它们是单页界面)。这些页面具有相似但不相同的功能。

所以我想拥有提供通用功能的 javascript 模块。然后每个页面可以自定义/覆盖部分通用功能。

我正在使用backbone.js,所以我要做的是:

  1. 加载包含常见模型、视图、集合等的文件。
  2. 加载自定义/覆盖步骤 1 部分的特定于应用程序的文件
  3. 调用一个 init() 函数来实例化所有必要的模型/视图/集合

目前,我将模块存储在类似于以下内容的模块容器中:https ://stackoverflow.com/a/9426071 每个模块都有一个可选的 init() 函数,由我的 main init() 函数执行。

例子:

  1. 我有一个名为 results.js 的文件。它定义了搜索结果的通用模型/集合/视图。在它的 init() 函数中,一切都被实例化了,但是这个函数还没有被调用:

    var resultView = new ResultView()
    
  2. 然后我包含 myApp.js,部分视图被覆盖。

  3. 主 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 拥有的所有模块?

或者我错过了什么,我应该以不同的方式构建我的代码吗?

欢迎任何提示/想法,

迈克尔

4

1 回答 1

4

正如上面评论中所讨论的,您可以避免通过使用函数体内的arguments对象循环遍历函数的参数来显式引用函数的参数。所以:

require(['module1', 'module2', 'module3', ..., 'moduleN'],
  function(module1, module2, module3, ..., moduleN) {
    var init = function() {
        module1.init();
        module2.init();
        module3.init();
        ...
        moduleN.init();
    };
    return {init: init};
});

变成:

require(['module1', 'module2', 'module3', ..., 'moduleN'],
  function() {
    var args = arguments;
    var init = function() {
        var module;
        for (module in args) {
            if (args.hasOwnProperty(module) && typeof module.init === 'function') {
                module.init.call(this);
            }
        }
    };
    return {init: init};
});

我在循环中添加了一个hasOwnProperty()检查,for in因为出于多种原因,这是一种很好的做法init此外,在尝试调用它之前,您会看到显式检查是否是一个函数。

的原因var args = arguments是您可以从内部函数中引用它 - 否则您将引用传递给 的参数init(),这不是您想要的。

顺便说一句,在建筑层面上,我认为你描述的项目结构非常好——我在很多非常大的项目中使用它,它从来没有让我失望。Require.js 太棒了!:)

于 2012-07-31T16:32:04.833 回答