2015-11-20 3 views
0

У меня есть вложенный составной вид, который проверяет его модель для коллекции, и если она устанавливает эту коллекцию как свою коллекцию.Marionette: набор настроек после рендеринга не обновляется по модели add

onRender: -> 
    if model.attributes.has_collection 
    @collection = model.get 'myCollection' 

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

Однако, когда нет коллекции, и кнопка нажата для создания новой модели, мне нужно создать модель, установить коллекцию (ее коллекцию) в модель представления и получить представление для отображения модель и любые дополнительные модели, которые добавлены. Я пробовал различные вещи, прямо сейчас я поставил коллекцию на модели, а затем запустить эту функцию:

class List.myCompositeView 
    childView: myView 
    // *** // 
    setChildren: -> 
    @collection = @model.get 'myCollection' 
    @render() 

Первая модель выглядит как положено, но дальнейшие модели, которые создаются не отображаются. Чтобы повторить, они появляются, когда коллекция установлена ​​в функции onRender. Я понимаю, что есть много кода, который я не добавлял сюда, поэтому, если есть что-то (потенциально) относящееся к проблеме, которое вам нужно знать, сообщите мне. Может ли быть, что представление не является обязательным для событий коллекции должным образом? Благодаря!

ответ

0

Марионеточная коллекцияView имеет частный метод под названием _initialEvents. Когда ваш CollectionView построен, он устанавливает этот метод для вызова при первом просмотре представления. Если ваш первый рендер - это когда набор данных не установлен, это имеет смысл, что события не будут правильно подключены. Вы должны быть в состоянии назвать этот частный метод после того, как вы установили коллекцию, и все должно работать: @_initialEvents()

Если это полезно, это реализация этого метода:

if (@collection) { 
    @listenTo(this.collection, 'add', @_onCollectionAdd); 
    @listenTo(this.collection, 'remove', @_onCollectionRemove); 
    @listenTo(this.collection, 'reset', @render); 

    if (@getOption('sort')) { 
    @listenTo(@collection, 'sort', @_sortViews); 
    } 
} 
+0

Спасибо за ответ! Просто обошел это, и все ближе, но не совсем. Я установил коллекцию и выхожу из вида, чтобы ее проверить: длина коллекции равна 1, длина детского изображения равна 0. Каждый раз, когда я нажимаю кнопку добавления, длина каждого увеличивается на 1 (поэтому я вижу всех новых детей). В принципе, новый childview не создается для первого. –

+0

Теперь я установил коллекцию, отобразил составной вид, а затем позвонил @_initialEvents(), который сохраняет все остальное. Боюсь, я мог бы слишком усложнять это, и не уверен, что у @render() есть какие-то негативные побочные эффекты, которых я должен избегать, но он работает, что является хорошим местом, чтобы быть :) Еще раз спасибо! –