4

たとえばjqueryを使用して、ビューを介して子にアクセスする前に、テンプレートが完全にレンダリングされるまで待つ方法はありますか?

didInsertElementが期待どおりに機能していないようです。テンプレートが完全に構築される前に、さらに0.5秒の遅延を追加する必要があります。テンプレートは、コントローラー内の配列を反復処理し、いくつかのdivを作成します。didInsertElementをオーバーライドしても、すぐにアクセスできないのはこれらのdivです。

4

2 に答える 2

16

私は最近、これをよりエレガントに行う何かをEmberに追加しました。それはafterRenderキューです。このコミット、特に使用例についてはテストを参照してください。

于 2012-11-27T06:07:10.980 に答える
14

これらの 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')
});
于 2012-08-23T17:52:18.160 に答える