Передача макетов (и манипулирование областями) через CollectionView (Marionette / Backbone)
Я пытаюсь передать макет в CollectionView, а затем управлять областями внутри него.
Прямо сейчас я успешно отправляю макет в CollectionView (который находится в его собственной области) следующим образом:
main_layout.main_region.show(new CollectionView({
itemView: ALayout,
collection : someCollection
}));
Затем я вижу, что макет визуализируется. Однако я не могу придумать способ изменить (или даже коснуться) области в "ALayout". Есть ли способ сделать это? В конце концов, я пытаюсь получить коллекцию "панелей" с макетом внутри каждой из них, который имеет те же регионы, и как-то раскрашивает эти регионы.
Кроме того, первоначально я просто передавал ItemView в CollectionView, но я мог бы придумать способ добавления областей в этот ItemView. Если возможно, я хотел бы управлять этими областями в файле, который я передаю (будь то макет или ItemView).
Есть ли у кого-нибудь опыт в этом?
Редактировать: Итак, я нашел подсказку с использованием позвоночника.Няня, которая приходит с марионеткой -- из этой документации, которая говорит о детях CollectionView здесь . Так что теперь мой код выглядит так.
var collectionViewToUse = new CollectionView({
itemView: ALayout,
collection : someCollection
});
main_layout.main_region.show(collectionViewToUse);
collectionViewToUse.children.each(function(view) {
console.log(view);
//This fails.
view.regionManagers.someRegion.show('HHHHHH');
//So does this, if I run it instead
view.someRegion.show('Anything');
});
Экземпляр представления магистрали регистрируется, так что я думаю, что я нахожусь на чем-то здесь. Может ли кто-нибудь сказать мне, как управлять регионами с этого шага?
2 ответа:
Хорошо, я думаю, что у меня есть ответ на этот вопрос. Надеюсь, это поможет кому-то еще в будущем!
Ответ был на пути использования няни. Вы в основном создаете экземпляр CollectionView, а затем используете BabySitter, чтобы прокрутить его и сделать что-то с каждым представлением. Поэтому, если вы передадите ему макет:var collectionViewToUse = new CollectionView({ itemView: ALayout, collection : someCollection }); main_layout.main_region.show(collectionViewToUse); collectionViewToUse.children.each(function(view) { view.someRegion.show(new SomeView({model : view.model }); });
Таким образом, в принципе, вы можете передать представление коллекции в виде макета вместо ItemView, а затем выполнить цикл через "представления" и передать новые представления в области.
Пожалуйста, прокомментируйте с какие-нибудь улучшения или если бы это помогло кому-нибудь еще!
Я обнаружил небольшое изменение этого паттерна, инкапсулировав логику внутри самой коллекции, а не изменяя ее снаружи.
var collectionViewToUse = new CollectionView({ itemView: ALayout, collection : someCollection, onBeforeItemAdded: function(view) { view.on('show', function() { view.someRegion.show( new SomeView({ model : view.model // view.model is model of Layout }) ); }); } }); main_layout.main_region.show(collectionViewToUse);
Все опубликованные ответы страдают от того, что
model
прикрепляется кLayout
, в то время как модель существует только для передачи в один из подвидов.