問題空間
分割ペイン スタイルの UI を作成できるように、いくつかのネストされた Ember ビューをレンダリングしています。ビューが最初にレンダリングされるときにビューのサイズを変更して、幅が等しくなるようにしたいと考えています。子ビューを相互に見たくないので、サブクラスを使用してEmber.ContainerView
、コンテンツとドラッグ可能なスプリッター ハンドルを保持しています。
Ember.View#didInsertElement
子ビューが完全にレンダリングされるまで待つ必要があるため、コンテナー ビューでは使用できません。
私の(試みられた)解決策
この回答で提示されているコードを使用しています:テンプレートが完全にレンダリングされるのを待つ方法。これにより、Ember.View を再度開いてテンプレートが起動したときに自動的に設定さisRendered
れるすべてのEmber.View
インスタンスにプロパティが追加されます。didInsertElement
Ember.View.reopen
didInsertElement: ->
res = @_super();
@_setIsRendered();
res
_setIsRendered: ->
if (!! @$())
@set('isRendered', true)
else
Ember.run.next this, ->
@_setIsRendered()
Ember.ContainerView
すべてのコンテナ ビューにプロパティを追加するために再度開いてみましchildViewsRendered
たが、Ember は反対し、childViews に項目が 1 つしかないコンテナ ビューに対して非常に奇妙な IndexOutOfBounds エラーをスローしました。
コレクションのコードを次の mixin に入れることになりました。
App.ChildrenRendered = Ember.Mixin.create
childViewsRendered: (->
res = @get('childViews').everyProperty('isRendered')
console.log('childViewsRendered', res, this)
# Pointer to this most offensive object for debugging
window.wtf = this
res
).property('childViews.@each.isRendered')
_runChildViewsDidRender: (->
if @get('childViewsRendered')
console.log('trying to invoke childViewsDidRender')
Ember.tryInvoke(this, 'childViewsDidRender')
).observes('childViewsRendered')
そして、私はこのようなクラスを持っています:
App.SplitterView = Ember.ContainerView.extend App.ChildrenRendered,
# ...(some properties)...
init: ->
child_views = @get('childViews')
child_views.pushObjects([App.WindowView.create(), App.WindowView.create()])
機能するもの:
App.SplitterView#childViewsRendered
ビューがレンダリングされる前に一度計算されるため、false
- ビューは Ember によって処理 (挿入およびレンダリング) され、独自の
isRendered
プロパティが適切に設定されます。 - 後で実行すると、
window.wtf.get('childViews').everyProperty('isRendered')
が返されますtrue
。
機能しないもの:
- 計算されたプロパティ
childViewsRendered
が再び更新されることはありません。 - 配列要素メンバーのダミー値の計算されたプロパティ
childView
も機能していないようです。