我想制作一种装载程序类。考虑:
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;
});
答案 0 :(得分:2)
您的代码存在问题,但它不是循环依赖项。这不起作用:
Loader[view] = require([include], function (Include) {
return Include;
});
由于:
带有一系列依赖项的require
调用的返回值不是模块。 (这是一个名为localRequire
的函数,它是require
函数的化身之一。)
RequireJS吞下了用于require
调用的回调的返回值。
为什么会这样,因为像这样的要求调用是异步的。该模块将在未来的某个不确定时间提供。
有一个require
调用,它返回一个模块值:require("module")
。您传递单个模块名称而不是数组。如果已经加载,这种调用会返回一个模块,或者立即失败。
至于循环依赖,我不相信RequireJS暴露了导致另一个模块加载的模块的名称。它handles circular dependencies的方式是,如果A需要B需要A,那么B必须准备接受当它被实例化时,它为A获得的值将是undefined
。然后它可以再次需要A,并获得真正的价值。