Ember.CollectionView所有子进程的didInsertElement回调

Aar*_*oir 2 ember.js

从Ember.CollectionView有一个简单的方法来渲染所有childView元素后调用一个函数?

像所有孩子的didInsertElement一样.

这就是我现在正在做的事情.有没有更好的办法?

App.CollectionView = Ember.CollectionView.extend

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

  itemViewClass: Ember.View.extend()
Run Code Online (Sandbox Code Playgroud)

编辑这里是我想要做的更好的例子.

对于每个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')
Run Code Online (Sandbox Code Playgroud)

编辑

调度afterRender回调有效!Ember.run.scheduleOnce('afterRender',@,'scrollToDate')

Chr*_*sey 5

每个ContainerView有两种方式,子视图进入dom:当父视图render()s时,它们与父视图一起插入,在这种情况下,当调用didInsertElement时它们将在DOM中. parentView,或者由于childViewsDidChange将回调添加到'render'队列而被强制进入DOM.

你可能会做的是将自己的回调添加到afterRender队列中,当[]更改时(视图本身作为数组用于观察目的),此时任何非'inDOM'视图都将被插入到视图中.

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