2013-03-12 3 views
2

Из Ember.CollectionView есть простой способ вызвать функцию после того, как все элементы childView были визуализированы?Ember.CollectionView all children didInsertElement callback

Что-то вроде didInsertElement для всех детей.

Это то, что я делаю сейчас. Есть ли способ лучше?

App.CollectionView = Ember.CollectionView.extend 

    didInsertChildElements: (-> 
    if @get('childViews').everyProperty('state', 'inDOM') 
    @dosomething() 
).observes('childViews') 

    itemViewClass: Ember.View.extend() 

EDIT вот лучший пример того, что я пытаюсь сделать.

Для каждого ChildView я устанавливаю позицию с помощью didInsertElement, а затем из родителя я хочу прокрутить до указанного дочернего элемента, используя обратный вызов didInsertElement. Проблема заключается в том, что callback didInsertElement родителя вызывается перед дочерним.

App.CollectionView = Ember.CollectionView.extend 
    dateBinding: 'controller.date' 

    didInsertElement: -> 
    #@scrollTo @get('date')#old way 
    Ember.run.scheduleOnce('afterRender', @, 'scrollToDate') 

    scrollToDate: -> 
    @scrollTo @get('date') 

    scrollTo: (date) -> 
    day = @get('childViews').findProperty('date', date) 
    pos = day.get('position') 
    #console.log pos 
    @$().scrollTop(pos) 

    itemViewClass: Ember.View.extend 
    templateName: 'home/day' 
    dateBinding: 'content.date' 
    position: null 

    didInsertElement: -> 
     @set 'position', @$().offset().top 
     #console.log @get('position') 

EDIT

Планирование обратного вызова работает afterRender! Ember.run.scheduleOnce ('afterRender', @, 'scrollToDate')

ответ

5

В каждом контейнере есть два способа: дочерние представления попадают в dom: либо они вставлены вместе с самим родительским представлением, когда родительский view render() s, и в этом случае они будут в DOM, когда didInsertElement вызывается для parentView, или они вынуждены в DOM как следствие childViewsDidChange, добавляя обратный вызов в очередь «рендеринга».

Что вы можете сделать, это добавить свой собственный обратный вызов в afterRender очереди, когда [] изменения (вид сам по себе действует как массив здесь, для целей наблюдения), с помощью которого точка любой не вид «inDOM» будут вставлены в представление.

didInsertChildElements: (-> 
    if @get('state') === 'inDom' 
     Ember.run.scheduleOnce('afterRender', this, 'dosomething'); 
).observes('[]') 
Смежные вопросы