2013-03-12 24 views
2

從Ember.CollectionView有一個簡單的方法來調用一個函數後,所有的childView元素已被渲染?Ember.CollectionView所有的孩子didInsertElement回調

就像所有孩子的didInsertElement一樣。

這就是我現在要做的。有沒有更好的辦法?

App.CollectionView = Ember.CollectionView.extend 

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

    itemViewClass: Ember.View.extend() 

編輯這裏是我想要做的更好的例子。

對於每個ChildView,我使用didInsertElement設置位置,然後從父級使用父級didInsertElement回調來滾動到指定的子級。問題是在孩子的父母的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') 

編輯

調度AfterRender階段回調的作品! Ember.run.scheduleOnce(「AfterRender階段」 @「scrollToDate」)

回答

5

有兩種方法,每ContainerView,這個孩子的意見進入DOM:要麼他們與父視圖本身當父一起插入查看render()s,在這種情況下,當父視圖調用didInsertElement時,它們將位於DOM中,或者由於childViewsDidChange將回調添加到「render」隊列,導致它們被強制進入DOM。

你可能會做什麼,然後是添加你自己的回調到afterRender隊列,當它指向任何不是'inDOM的意見將被插入[]變化(本身在這裏充當陣列的觀點,觀察目的),進入視野。

didInsertChildElements: (-> 
    if @get('state') === 'inDom' 
     Ember.run.scheduleOnce('afterRender', this, 'dosomething'); 
).observes('[]')