4

2 つの条件が満たされたときにハンドラーを実行する必要があります。

  1. ArrayController に関連付けられたビューが DOM に挿入されます
  2. arrayController コンテンツは、ストアを介して完全にロードされます

controller.isLoadedのプロパティにオブザーバーを追加しようとしましたdidInsertElementが、オブザーバー ハンドラーが呼び出されません。

didInsertElement: function() {
    this.addObserver('controller.isLoaded', function() {
        console.info('inserted the element and store is loaded');
    });
},

メソッドの外側でオブザーバーをセットアップするとdidInsertElement、ビューが dom に挿入される前に、オブザーバーがハンドラーを呼び出すのが早すぎます。

handler: function() {        
    var content, controller = this.get('controller');
    console.info(controller.get('content').get('isLoaded'));
}.observes('controller.isLoaded')

また、上記のシナリオのハンドラーが 2 回呼び出され、そのたびに controller.get('content') が空の配列を表示する理由がわかりません

4

3 に答える 3

1

考えられる答え:ここで私の解決策がぴったりだと思うかもしれません。アイデアは、ビューテンプレートのサブセクション{{trigger}}がレンダリングされたときにイベントを発生させるハンドルバーヘルパーを追加することです。たとえば、テンプレートにのようなブロックがすでにある場合は、次のように実行できます。{{#if content.isLoaded}}

{{#if content.isLoaded}}
    {{#each content}}
        ...
    {{/each}}
    {{trigger contentDidRender}}
{{else}}
    <p>Loading...</p>
{{/if}}

また、データが表示されたときに常にイベントを取得する必要があります。ハンドルバーテンプレートはすでにこれをかなりうまく達成しているので、私はそれを利用しました。

試したことで問題が発生する理由については、ビューの表示とコンテンツの読み込みの間に競合状態が発生している可能性があります(最初に発生する可能性があるのは未定義です)。つまり、isLoaded後にオブザーバーを追加した可能性があります。すでにロードされているため、変化は見られませんでした。また、(私が思うに)ハンドラーは、監視対象のプロパティが設定observesされるたびに呼び出され、変更されるたびには呼び出されないことに注意してください...したがって、ハンドラーは2回設定されている可能性がありますが、両方ともfalseに設定されている可能性があります。

于 2013-01-11T09:08:12.030 に答える
0

おそらくdidInsertElementで、実際の解決策の代わりにもう1つのヒントがあり、オブザーバーは間違って定義されていると思われるため呼び出されません。(キーチェーンをサポートしているかどうかはわかりません)。次のようにします:

didInsertElement: function() {
  this.get('controller.content').addObserver('isLoaded', function() {
    console.info('inserted the element and store is loaded');
  });
}

これが機能する場合は、 willDestroyElement フック内でこのオブザーバーを削除することを忘れないでください

于 2013-01-11T00:21:18.650 に答える
0

addObserver の構文では、2 番目のパラメーターがハンドラーが実行されるコンテキストである必要があると思います。

didInsertElement: function() {
  this.addObserver('controller.isLoaded', this, function() {
    console.info('inserted the element and store is loaded');
  });
}

2 番目のパラメータは「this」であることに注意してください。プロパティの変更を観察するためのドキュメントを確認してください

于 2013-10-29T11:38:26.327 に答える