2012-01-25 2 views
4

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

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

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

Там быстр реклама об круговой зависимости в RequireJS документы:

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

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

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

+0

Зачем вам нужна циркулярная зависимость? Как написано в require.js docs: «Циклические зависимости редки и обычно являются признаком того, что вы, возможно, захотите переосмыслить дизайн». – SunnyRed

+0

Да, это правда. Однако я изложил структуру выше. Если вы можете предоставить древовидную структуру, которая не является рекурсивной/циклической зависимостью, укажите этот пример. –

+0

Sry, я не понял ваш дизайн правильно с первого взгляда. Итак, а) использует sth. как категория и подкатегория не может быть и речи? б) Вы видели это: http://stackoverflow.com/questions/6150378/backbone-with-a-tree-view-widget & http://stackoverflow.com/questions/6026752/backbone-collections-representing- деревопереработки данных. c) Я думаю, что это могло бы помочь, если вы добавите свой текущий код, чтобы прояснить проблему. – SunnyRed

ответ

2

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

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

Смежные вопросы