6

コレクション全体をロードしてから、サーバーへの往復を毎回行わずに、一度に 1 つずつレコードを剥がしてモデルとして使用したいと考えています。

Ember.Deferred を使用してプロミスを返す方法を理解しましたが、適切なタイミングでプロミスを解決することができません。次のコードは、常に「Found 0」を出力します。

App.PersonRoute = Ember.Route.extend({
  model: function(params) {
    var name = "Erik";
    var promise = Ember.Deferred.create();
    App.people = App.Person.find();

    App.people.then(function() {
      console.log('Found ' + App.people.get('length'));
      var person = App.people.findProperty('name', name)
      promise.resolve(person);
    });

    return promise;
  }
});

then() の本体を setTimeout でラップし、数秒待機させると、すべてがうまく機能します。

何とかバインドできる別のイベントはありますか? App.people.on('isLoaded') を試しましたが、isLoaded は常に true です。

ありがとう!

4

2 に答える 2

7

何とかバインドできる別のイベントはありますか?

確かにあなたが聞くことができるイベントがあり、それはdidLoad.

App.people.on('isLoaded') を試しましたが、isLoaded は常に true です。

これについてisLoadedは多くの混乱がありました。たとえば、ここを参照してください。混乱は、ストアがレコードの読み込みを終了したときに、レコードが最初にだった場合でも、設計によりisLoadedフラグが true に設定されるという事実から生じます。すでに現地で入手可能。次に、サーバーへのリクエストが返されると、バックエンドから受信したレコードが入力され、バインディングが開始され、テンプレートが更新されます。RecordArrayRecordArray

ガイドに記載されているように:

ロード済みでクリーンなレコードは、その属性と関係に関する情報をサーバーから受け取り、クライアントでローカルに変更が加えられていないことを意味します。

上で述べたように、didLoad火を作るものでした。

モデル関連のイベントについては、モデルのライフサイクルの下にあるガイドを参照してください。

セットアップに合わせて、コードを次のように書き換えることができます。

App.PersonRoute = Ember.Route.extend({
  model: function(params) {
    var name = "Erik";
    var promise = Ember.Deferred.create();
    App.people = App.Person.find();

    App.people.on('didLoad', function() {
      console.log('Found ' + App.people.get('length'));
      var person = App.people.findProperty('name', name)
      promise.resolve(person);
    });

    return promise;
  }
});

それが役に立てば幸い。

于 2013-06-22T22:53:25.043 に答える
2

promise が適切なタイミングで解決されない場合、Ember/data の (かなり重大な) バグであると思います。Emberjs/data でバグを埋めることをお勧めします。

ただし、別のプロミスの使用がこのバグを引き起こしている可能性があると思われます。

App.Person.findは既に promise を返しています。から戻るときは、その promise 自体を使用する必要がありますmodel()。また、その約束を解決するには、結果を返すだけです。

Promisesをサポートしていない外部非同期 API を統合する場合は、通常、使用したの実装スタイルが必要ですPromises

model()私はあなたのようにリファクタリングします。これにより、非同期タイミングの問題が修正される場合があります。

App.PersonRoute = Ember.Route.extend({
  model: function(params) {
    var name = "Erik";
    var promise =  App.Person.find();

    promise.then(function() {
      console.log('Found ' + App.people.get('length'));
      return App.people.findProperty('name', name)
    });

    return promise;
  }
});

Q ライブラリのドキュメントは、promise の最適な使用方法を見つけるのに非常に役立つことがわかりました。Ember は別のライブラリである RSVP を使用しますが、原理は似ています。

于 2013-06-25T08:29:41.867 に答える