从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')
答案 0 :(得分: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('[]')