我正在将类别树视图重写为RequireJS和Backbone应用程序。
结构很简单:每个类别都包含一组子类别。
然而,循环依赖问题变得很快。类别模型需要类别集合,类别集合需要类别模型。
在RequireJS文档中有关于循环依赖的快速模糊:
http://requirejs.org/docs/api.html#circular
然而,似乎我错过了一些东西,因为我仍然会得到未定义和/或错误。我认为在示例中只看到'b'而不是'a'让我无法理解。
是否有人能够提供一个可能澄清的简单示例?那个,或者更好的结构化方法,不需要循环依赖。
答案 0 :(得分:2)
由于循环引用,当require.js加载“b”作为“a”的先决条件时,它不能返回“a”的值,因为尚未调用initModule()
。但是,在调用b.somethingElse()
时,模块“a”已初始化,require("a")
调用将返回。
以下代码显示了两个模块中的内容 - 它们加载的顺序无关紧要。我已经从require.js示例中稍微改了一下,以使其更加明显。
// Inside a.js:
define(["require", "b"],
function initModule(require) {
return {
doSomehingWithA: function() { ...},
doSomethingElse: function(title) {
// by the time this function is called,
// require("b") will properly resolve
return require("b").doSomethingWithB();
}
}
}
);
// Inside b.js:
define(["require", "a"],
function initModule(require) {
return {
doSomethingWithB: function() {...},
doSomethingElse: function(title) {
// by the time this function is called,
// require("a") will properly resolve
return require("a").doSomethingWithA();
}
};
}
);
顺便说一下,虽然在一般循环引用是一种糟糕设计的症状,但并非总是如此。例如,我实现了一个小部件工厂模块,其中引用了一个“容器小部件”模块,然后该模块必须引用工厂才能创建其内容。完全合法。