backbone.js – Backbone,RequireJS和Tree

我正在将类别树视图重写为RequireJS和Backbone应用程序.

结构很简单:每个类别都包含一组子类别.

然而,循环依赖问题变得很快.类别模型需要类别集合,类别集合需要类别模型.

在RequireJS文档中有关于循环依赖的快速模糊:

http://requirejs.org/docs/api.html#circular

但是,似乎我错过了一些东西,因为我仍然得到未定义和/或错误.我认为只是在示例中看到“b”而不是“a”让我无法理解.

有人能提供一个可能澄清的简单例子吗?那,或者更好的结构化方法,不需要循环依赖.

最佳答案 由于循环引用,当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();
            }
        };
    }
);

顺便说一下,虽然通常循环引用是设计不良的症状,但并非总是如此.例如,我实现了一个小部件工厂模块,其中引用了一个“容器小部件”模块,然后该模块必须引用工厂才能创建其内容.完全合法.

点赞