私がCollectionView
ember.jsにいるとしましょう。
最初に、content
プロパティがいくつかの要素を持つ配列にバインドされているとしましょう。CollectionViewはこれらの要素をレンダリングし、それらがDOMにdidInsertElement
入ると、最初に各childViewに対して呼び出され、最後にCollectionView
それ自体に対して呼び出されます。
変更を想定してみましょうcontent
(たとえば、新しいアイテムが追加されたり、配列が完全に置き換えられたりします)。はCollectionView
、新しい子を追加するか、子を完全に置き換えます。それに応じてDOMが更新されます。しかし、の必要はありませdidInsertElement
んCollectionView
。
DOMにすべての変更を加えた後、カスタムJSを実行したいと思います。didRerenderElementまたはdidUpdateElementフックのようなもの。
何を試しましたが、機能しませんか?
- このコードをCollectionViewに入れることはできません。これ
didInsertElement
は、配列が変更されてDOMが更新されるたびにコードが起動されないためです。 - 監視を試みましたが、実際のDOM更新が行われる前に
content
、オブザーバーは常に起動していました。 - 観察してみ
childViews
ましたが、似たようなケースです。
私のために働いた1つのあいまいな解決策はこれでした:
App.MyCollectionView = Ember.View.extend({
childrenReady: 1, // anything, value doesn't matter
itemViewClass: Ember.View.extend({
didInsertElement: function () {
this.get('parentView').notifyPropertyChange('childrenReady');
}
}),
childrenGotReady: function () {
if (this.get('childViews').everyProperty('state', 'inDOM')) {
// run that custom JS code here (e.g. apply jQuery masonry to the elements)
}
}.observes('childrenReady')
});
しかし、これはあまりにもあいまいであり、他の問題も発生しがちです。
私はこれを読みました:Emberビューの一部が再レンダリングされるときはいつでもコードを実行するにはどうすればよいですか?しかし、それはsには当てはまりませんCollectionView
。
私は私のアプリの多くの部分でこれに遭遇しています、そして私は本当にemberjsがこれのための標準的な方法を持っていることを期待しています。