Как разрешить циклические зависимости с помощью вложенных представлений в Backbone.js - PullRequest
1 голос
/ 20 января 2012

Я создаю приложение, используя Brunch и Backbone.js, которое должно включать вложенные меню.Я создал MenuItemModel и MenuItemsCollection, которые расширяют соответствующие базовые базовые объекты.

Кроме того, у меня есть MenuItemView (для отдельных элементов), а также MenuItemsView (для коллекций элементов).В упрощенном виде они выглядят так:

class MenuItemView extends Backbone.View
  tagName: 'li'

  initialize: (options) ->
      if @model.get('children')?
          childCollection = new MenuItemList
          childView = new MenuItemsView
              el: $('<ul>').appendTo @el
              collection: childCollection

class exports.MenuItemsView extends Backbone.View
    initialize: (options) =>
        @collection.bind 'add', @add

    add: =>
        view = new MenuItemView { model: @collection.last() }

Как видите, между двумя представлениями существует циклическая зависимость, и не совсем неожиданно, строка "childView = new MenuItemsView" приводит к "Uncaught ReferenceError: MenuItemsView не определен "в моей JS-консоли.

Мой вопрос, есть ли способ решить эту проблему?Позднее в коде я могу создавать вложенные меню с помощью рекурсивной функции, но это не кажется таким аккуратным и самодостаточным, как хотелось бы.Кроме того, я обнаружил следующие два случая в SOF, где люди предлагают использовать вложенные представления в точности как в коде выше.Что я делаю не так?

https://stackoverflow.com/a/6476507

Вложенные представления в представлениях в магистрали js

1 Ответ

1 голос
/ 20 января 2012

Поскольку вы не используете MenuItemsView в определении класса MenuItemView, проблем быть не должно.Попробуйте изменить

childView = new MenuItemsView

на:

childView = new exports.MenuItemsView

Похоже, вы помещаете MenuItemsView в пространство имен экспорта, но initialize ищет класс с именем MenuItemsView в своем собственномлокальное пространство имен.

...