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 に入る方法は 2 つあります。1 つは、親ビューが render() するときに親ビュー自体とともに挿入される方法です。または、「レンダリング」キューにコールバックを追加する childViewsDidChange の結果として、それらは DOM に強制されます。

次に行うことは、変更afterRender時に独自のコールバックをキューに追加することです[](ビュー自体は、観察目的でここでは配列として機能します)。その時点で、「inDOM」ではないビューがビューに挿入されます。

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