8

親のモデルにアクセスする必要があるルートを作成しようとしています。を使用しますthis.modelFor()が、それを行うと、親のモデルが完全に読み込まれていないため、そのすべてのプロパティに が含まれていますnull

これはルーターで、2 つの動的セグメントがあります。

MGames.Router.map(function () {
    this.resource('games', function () {
        this.resource ('game', {path: '/:game_id'}, function () {
            this.resource('board', {path: '/boards/:board_id'});
        });
    });
});

これは完璧に動作する私の GameRoute です。

MGames.GameRoute = Ember.Route.extend ({
    model: function (params) {
        return MGames.Game.find(params.game_id);
    }
});

最後に、これは Game モデルへのアクセスを必要とする子ルートです。これは私が書いたものです。しかし、私が何をしても、console.log()常に出力されnullます。game変数を確認すると、isLoadプロパティは常に null です。

MGames.BoardRoute = Ember.Route.extend ({
    model: function (params) {
        var game = this.modelFor ('game');
        console.log (game.get("id"));
        return MGames.Board.find(game.get("id"), params.board_id);
    }
});

私は何か間違ったことをしていますか、それとも (私が疑うように) Ember の概念が欠けていますか?

4

1 に答える 1

6

コードのこの部分は良さそうです。ネストされたルートは を介し​​て親のモデルを取得する必要があるという点で、あなたの仮定は正しいmodelForです。

あなたの find メソッドがバグの原因だと思います。私はあなたの前の質問を見ましたが、ここでも同じものGame.findが使用されていると思います(?)

問題は、と関係がありPromisesます。modelEmber のルーターは、フックの非同期性を理解しています。ただし、その作業を行うには、 a を返すことに依存していますPromise。現在、jQuery promise を使用していますが、gameオブジェクトを初期化されていない状態ですぐに返します。クエリはサーバーから読み込まれますが、model()フックはそれが発生する前に解決されていると想定されます。

PromiseフックからjQueryを直接返したいmodel+最初に解析を行い、thenそれを結果として返します。

変更したGame.find. 他のファインダーにも同じ原則が適用されます。

find: function (game, board) {
  url = [MGames.GAMES_API_URL];
  url.push ('games');
  url.push (game);
  url.push ('boards');
  url.push (board);
  url = url.join('/');

  return $.getJSON(url)
    .then(function(response) {
      var game = MGames.Game.create({isLoaded: false});
      game.setProperties(response);
      game.set('isLoaded', true);

      return game;
    });
}

ゲームオブジェクトはそのまま返されることに注意してください。Ember は、promise が (promise 以外のものを返すことによって) 解決されると、その結果がmodel()フックのモデルになることを理解しています。このオブジェクトは、ネストされたルートでgame使用できるようになるモデルです。modelFor

于 2013-07-08T03:08:51.713 に答える