识别requirejs中的调用模块

时间:2013-12-12 22:19:42

标签: backbone.js requirejs

我想制作一种装载程序类。考虑:

config.js

define(function() {
     return {
       appViews : [
            'baseViews',
            'fullDocViews', 
            'docCreateViews',
            'accountViews',
            'fullDocViews',
            'notifyViews'
        ]
    }
}

loader.js

define(['config', 'underscore'], function (Config, _) {
    var Loader = {};

    _.each(Config.appViews, function (view) {
        var include = 'views/'+view;
        Loader[view] = require([include], function (Include) {
            return Include;
        });
    });
    return Loader;
});

fullDocViews.js

define(['loader'], function (Loader) {
    var moduleView = Loader.baseViews.BaseView.extend({
        // Loving life here...
    })
});

但是,这会创建一个循环依赖项,因为调用loader会调用fullDocsView模块。有没有办法,在loader.js中,我可以从生成的视图哈希中排除调用模块?

所以我正在寻找的是:

define(['config', 'underscore'], function (Config, _) {
    var Loader = {};

    _.each(Config.appViews, function (view) {
        if (view !== callingView) {
            var include = 'views/'+view;
            Loader[view] = require([include], function (Include) {
                return Include;
            });
        }
    });
    return Loader;
});

1 个答案:

答案 0 :(得分:2)

您的代码存在问题,但它不是循环依赖项。这不起作用:

Loader[view] = require([include], function (Include) {
    return Include;
});

由于:

  1. 带有一系列依赖项的require调用的返回值不是模块。 (这是一个名为localRequire的函数,它是require函数的化身之一。)

  2. RequireJS吞下了用于require调用的回调的返回值。

  3. 为什么会这样,因为像这样的要求调用是异步的。该模块将在未来的某个不确定时间提供。

    有一个require调用,它返回一个模块值:require("module")。您传递单个模块名称而不是数组。如果已经加载,这种调用会返回一个模块,或者立即失败。

    至于循环依赖,我不相信RequireJS暴露了导致另一个模块加载的模块的名称。它handles circular dependencies的方式是,如果A需要B需要A,那么B必须准备接受当它被实例化时,它为A获得的值将是undefined。然后它可以再次需要A,并获得真正的价值。