2

動的データなどでjQueryプラグインを初期化する方法について多くの質問を見つけました。通常、答えはdidInsertElementフックを使用する必要があるということです。私の問題は、ember-dataを使用する場合、最初はビューが空に挿入され、その後、バインディングを介してテンプレート変数が入力されることです。したがって、didInsertElement私が必要とする要素にはありません。

私は自分に合った解決策を見つけましたが、もっと良い解決策があるに違いないと思います。

メソッドに加えてdidInsertElement、コントローラーの属性も観察し、そこからコードを呼び出してEmber.run.next、子ビューが前にレンダリングされるようにラップします。

更新された子ビューに対応するためのより良いソリューションはありますか?

4

2 に答える 2

1

私はこの問題を抱えて解決策を考え出しました。サブセクションがレンダリングされたときに通知するハンドルバーヘルパーを作成します。それが他の人々の助けになることを願っています!

于 2012-12-13T10:38:42.253 に答える
1

これは、アプリケーションのサイズと、ビューがレンダリングする要素の数に少し依存します。

編集:RecordArrayのisLoadedプロパティを正常に監視できる場合があります。詳細はこちら:https ://github.com/emberjs/data/blob/master/packages/ember-data/lib/system/record_arrays/adapter_populated_record_array.js#L21

コンテンツとして単一のオブジェクトを持つビューに使用したオプションの1つは、次のようなものです。

MyApp.CustomView = Ember.View.extend({
    content: null,

    contentObserver: function() {
        this.rerender();
    }.observes('content')
}

ただし、ビューの内容がリストの場合、リスト内の各アイテムのビューを再レンダリングすることはほとんど意味がありません。

ただし、このアプローチは、すでに行っていることとかなり似ていると思います。

もう1つのアプローチは、EmberDataを使用して独自のアダプターを実装することです。このようにして、データのロードが終了したことをアプリケーションの残りの部分に伝えることができます。何かのようなもの:

MyApp.Adapter = DS.Adapter.create({
    //Finding all object of a certain type. Fetching from the server
    findAll: function(store, type, ids) {
        var url = type.url;
        jQuery.getJSON(url, function(data) {
            store.loadMany(type, data);
        });

        //Perform some custom logic here... 
    }
}

これは機能するはずですが、本来あるべき/可能性があるほど一般的ではありません。

また、このコミットを確認することをお勧めします。これにより、1回限りのイベントを登録できます。

https://github.com/emberjs/ember.js/commit/1809e65012b93c0a530bfcb95eec22d972069745#L0R19

于 2012-06-28T11:06:47.327 に答える