2

ID に対応するバックエンドからオブジェクトをロードできるように、deserialize メソッドをオーバーライドしています。ただし、このオブジェクトを取得する方法は非同期です。Deserialize はコールバックを待たず、自動的に戻ります。

例:

show: Em.Route.extend({
        route: "/:id",
        deserialize: function(router, post) {
            var postController = router.get('postController ');
            postController.findById(post.id, function(post) {
                return post
            });
        }

バックエンドへの呼び出しが行われますが、逆シリアル化は自動的に戻ります。逆シリアル化で非同期呼び出しを処理する方法はありますか?

ありがとうございました

4

3 に答える 3

3

Luke Melia は NYC Ember ミートアップ ライトニング トークで、jQuery Deferred オブジェクトを介した Promises を使用して、まさにこのことについて話しました。基本的に、Ember は (オブジェクトにthenメソッドがあるかどうかを確認することによって) Promise を返すかどうかを検出し、ルートをloading状態にします (デシリアライズで状態の兄弟として宣言する必要があります)。ajax.doneで、Promise を解決できます。これにより、データが完全にロードされた状態でルータが完全に配置されます。

新しいルーターでは、バニラの状態マネージャーにある非同期遷移のサポートを実際に使用することは想定されていませんが、自動読み込み状態を使用して同じ種類のことを実現できます。

于 2012-10-02T19:56:04.293 に答える
0

Emberの新しいバージョンでは、ロードするデータに何らかのプロキシを使用する必要があります。

    {
      PostController: Ember.ObjectController.extend({
          find: function (id) {
              var ajax = Em.$.ajax(); //call the ajax thing
              ajax.done(Em.$.proxy(function (data) {
                  this.set('content', data);
              }, this));
              return this;
          }
      })
      ...
      Router: Em.Router.extend({
          show: Em.Route.extend({
              deserialize: function(router, post) {
                  var postController = router.get('postController');
                  postController.find(post.id);
                  return postController;
              }
          });
      })
    }
于 2012-07-11T11:57:27.527 に答える
0

これが私が見つけたものです。これは古いバージョンのemberで機能します:

州/ルートの入力機能で、データのロードを試みることができます。enter 関数は、2 つのメソッドを持つ遷移オブジェクトで 2 番目の引数として受け取ります。1 つは「async」で、他のメソッド「resume」が Bean を呼び出すまで続行できないことを遷移に伝えます。

したがって、例では:

    ...
    enter: function (r, t) {
           t.async();
           r.get('postController').loadResources(t.resume);
    },
    ...
于 2012-07-10T12:13:11.410 に答える