2

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

4

1 回答 1

5

对于每个 ContainerView,子视图有两种进入 dom 的方式:要么在父视图 render() 时将它们与父视图本身一起插入,在这种情况下,当为parentView,或者由于 childViewsDidChange 将回调添加到“渲染”队列,它们被迫进入 DOM。

然后你可能会做的是在afterRender队列中添加你自己的回调,当[]发生变化时(视图本身在这里充当数组,用于观察目的),此时任何非“inDOM”视图都将被插入到视图中。

didInsertChildElements: ( ->
    if @get('state') === 'inDom'
        Ember.run.scheduleOnce('afterRender', this, 'dosomething');
).observes('[]')
于 2013-03-12T01:38:21.970 回答