从Ember.CollectionView是否有一种简单的方法可以在渲染完所有childView元素后调用函数?

像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')

最佳答案

对于每个ContainerView, subview 都有两种进入dom的方式:或者在父 View render()时将它们与父 View 本身一起插入,在这种情况下,当对didInsertElement进行调用时,它们将位于DOM中。 parentView,否则由于childViewsDidChange将回调添加到“渲染”队列而被迫进入DOM。

然后,您可以做的就是在afterRender更改时(将 View 本身用作数组,出于观察目的)将自己的回调添加到[]队列中,届时将在该 View 中插入所有非“inDOM” View 。

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

关于ember.js - Ember.Collection查看所有子级didInsertElement回调,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15350894/

10-11 15:27