从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/