たとえばjqueryを使用して、ビューを介して子にアクセスする前に、テンプレートが完全にレンダリングされるまで待つ方法はありますか?
didInsertElementが期待どおりに機能していないようです。テンプレートが完全に構築される前に、さらに0.5秒の遅延を追加する必要があります。テンプレートは、コントローラー内の配列を反復処理し、いくつかのdivを作成します。didInsertElementをオーバーライドしても、すぐにアクセスできないのはこれらのdivです。
たとえばjqueryを使用して、ビューを介して子にアクセスする前に、テンプレートが完全にレンダリングされるまで待つ方法はありますか?
didInsertElementが期待どおりに機能していないようです。テンプレートが完全に構築される前に、さらに0.5秒の遅延を追加する必要があります。テンプレートは、コントローラー内の配列を反復処理し、いくつかのdivを作成します。didInsertElementをオーバーライドしても、すぐにアクセスできないのはこれらのdivです。
私は最近、これをよりエレガントに行う何かをEmberに追加しました。それはafterRender
キューです。このコミット、特に使用例についてはテストを参照してください。
これらの childViews をどのように挿入するかはわかりませんが、それを行う 1 つの方法は次のとおりです。
didInsertElement: function(){
if (this.$().find(".myAwesomeChildViews").length > 0) { // <-- adapt this to your needs
// my childViews are inserted
} else {
Ember.run.next(this, function() {
this.didInsertElement();
});
}
}
ここで重要なことは、チェックが true と評価されるまで didInsertElement() が呼び出され続けることです。
さらに良いことに、次のようにリファクタリングできます。
Ember.View.reopen({
didInsertElement: function() {
this._super();
this.setIsRendered();
},
setIsRendered: function() {
if (!!this.$()) {
this.set('isRendered', true);
} else {
Ember.run.next(this, function() {
this.setIsRendered();
});
}
},
});
そして、あなたの見解では:
App.MyView = Ember.View.extend({
areMyChildViewsRendered: function() {
return this.get('childViews').everyProperty('isRendered');
}.property('chilViews.@each.isRendered')
});