Магистраль, RequireJS и дерево - PullRequest
4 голосов
/ 25 января 2012

Я переписываю представление дерева категорий в приложение RequireJS и Backbone.

Структура проста: каждая категория содержит набор дочерних категорий.

Однако проблема циклической зависимости быстро становится очевидной. Модель категории требует коллекции категорий, а коллекция категорий требует модели категорий.

В документах RequireJS есть краткая информация о круговой зависимости:

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

Однако, мне кажется, что я что-то упустил, потому что я все еще получаю неопределенные и / или ошибки. Я думаю, что видение «b», а не «a» в примерах, мешает мне понять.

Кто-нибудь может привести простой пример, который мог бы прояснить? Это, или лучший способ структурирования, который не требует циклической зависимости.

1 Ответ

2 голосов
/ 14 февраля 2012

Из-за циклической ссылки, когда require.js загружает «b» в качестве предварительного условия для «a», он не может вернуть значение для «a», потому что a's 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();
            }
        };
    }
);

Кстати, в то время как в общие циклические ссылки являются признаком плохого дизайна, это не таквсегда так.Например, я реализовал модуль фабрики виджетов, который, помимо прочего, ссылался на модуль «контейнерного виджета», который затем должен был ссылаться на фабрику, чтобы создать ее содержимое.Совершенно законно.

...