Backbone.js вложенные представления, общие идеи

#javascript #backbone.js

#javascript #backbone.js

Вопрос:

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

Допустим, у вас есть несколько диалоговых окон, и в каждом диалоговом окне есть несколько вкладок. Определенная вкладка может повторно использоваться более чем в одном диалоговом окне. Каждая вкладка очень отличается, и вы можете динамически добавлять новую вкладку в диалоговое окно.

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

Это мой главный вопрос:

Если родительский вид хочет отображать дочерние представления, ему, вероятно, нужно сделать что-то вроде:

 var childView = new ChildView();
  

А затем используйте jQuery для

 this.$("#listOfChildViews").append(childView.el);
  

Чтобы убедиться, что список очищен перед добавлением, нам нужно

 this.$("#listOfChildViews").html("");
  

Является ли это предпочтительным способом сделать это? Мне кажется немного плохим из-за того, что я вырываю весь список, а затем создаю все новые объекты и добавляю их туда все сразу. Возможно, было бы лучше, если бы не было функции ‘render’ как таковой, а скорее ‘renderInitially’, а затем просто ‘add’ (для добавления новых дочерних представлений).

Извините, это не слишком связно!

Комментарии:

1. Не забудьте отменить привязку всех вложенных представлений.

Ответ №1:

Ник,

Я думаю, вам следует использовать возможности базовых моделей.

Создайте модель диалога (или, может быть, TabContainer, поскольку диалог больше похож на концепцию представления). В каждом диалоговом окне есть набор вкладок (вкладка снова находится во вселенной представлений).

При первоначальном рендеринге в диалоговом окне отображается весь диалог.коллекция вкладок, каждая в TabView.

Затем в диалоговом окне вы можете прослушивать события из коллекции вкладок диалоговой модели (добавить, удалить, сбросить) и добавлять / удалять только те представления, которые соответствуют измененным элементам.

Вы должны сами создавать функции, которые добавляют / удаляют представления. Функция add создаст и отобразит представление для добавленной вкладки и добавит его в this .$(«#listOfChildViews»).

Надеюсь, это поможет.

Комментарии:

1. Спасибо за ваш ответ, Дира! Мне нравятся ваши идеи. Пара более конкретных вопросов… Поскольку DialogView имеет модель диалога, а модель диалога имеет эту коллекцию вкладок, не будет ли модель диалога ссылаться на представления? Мне это кажется нормальным, но нормально ли это?

2. Другими словами, ссылки идут: DialogView> DialogModel> TabCollection> TabView> TabModel — этот тип дизайна в порядке или есть какая-то большая проблема, которую я упускаю?

3. ссылки идут: DialogModel -> TabsCollection -> TabModel. DialogView -> DialogModel. TabView -> TabModel. Представления о моделях, модели не знают о представлениях. Или у вас может быть DialogView -> TabsCollection, TabView -> TabModel. Вы должны найти другие имена для TabModel, которые зависят не от того, как отображается эта информация, а от того, какую информацию она содержит.