2012-05-13 10 views
6

Ember.Viewサブクラスのメソッドで、ビュー要素がすでにDOMに挿入されている場合のみ、DOM を変更したいと思います。それをどうやって確認できますか?Ember.js:DOMに表示要素が挿入されているかどうかをチェック

は、私はそうのような補助プロパティを作成することができます知っている:

didInsertElement: function() { 
    this.set('elementIsInserted', true); 
} 
willDestroyElement: function() { 
    this.set('elementIsInserted', false); 
} 

しかし、いくつかの標準的な、組み込みの方法はありますか?

スキミングが見つからないview.jsしかし、おそらく私は何かが不足しています。

答えて

9

あなたが補助フラグを設定することを避けるためにしたい場合は、Ember.View拡張することができます:今Ember.Viewは上記を取得する拡張し、すべてのビューを

Ember.View.reopen({ 
    didInsertElement: function() { 
     this.set('elementIsInserted', true); 
     this._super(); 
    }, 

    willDestroyElement: function() { 
     this.set('elementIsInserted', false); 
     this._super(); 
    } 
}); 

を。

また、コアチームのメンバーは、inDOMを参照することを避けることを提案しました。これは内部変数であり、コードでの使用を意図していないためです。

+0

ありがとう! Ember.Viewのサブクラスで独自のdidInsertElementを宣言するたびに 'this._super()'を呼び出さなければならないという欠点があります。 –

+0

これはまさに私が簡潔な答えに感謝したものです。 – Nomad101

+0

コントローラーの中からどのようにこれにアクセスしますか?コントローラに、ビューが挿入された後にのみ実行したいコードがありますが、そのコードをdidInsertElement内に入れたくないとします。私はこのフラグをチェックし、メソッドに.observes()を何を置くのでしょうか?ありがとう! – bfcoder

13

すべてのビューには、要素が挿入されたときに "inDOM"に設定される_stateプロパティがあります。

if (this._state=="inDOM") doStuff(); 

が有効です。 thisが正しいことを確認してください。

+0

Zackの答えは「正しい」と思っているので、私はZackの回答に同意したとマークしていますが、実際に自分のアプリでこれをやっているのは簡単だからです。私はプロパティにそれを簡単に変更できるようにカプセル化しています:https://gist.github.com/246bbf7305e09ed7ce80 –

+0

Ember 1.6で 'state'プロパティの名前が' _state'に変更され、古いフォームは廃止予定とマークされています1.8で – Gil

+0

@Gilありがとう。私は答えを編集します。 – weltraumpirat

関連する問題