Передача макетов (и манипулирование областями) через 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 4

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, в то время как модель существует только для передачи в один из подвидов.