8

我正在尝试编写需要访问其父模型的路线。我使用this.modelFor(),但是当我这样做时,父模型没有完全加载,所以它的所有属性都包含null.

这是路由器,有两个动态段:

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属性始终为空:

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. Ember 的路由器了解model钩子的异步性质。但它依赖于你返回 aPromise来完成它的工作。目前您正在使用 jQuery 承诺,但会game立即以未初始化状态返回对象。查询从服务器加载,但model()假定挂钩在此之前已解决。

您想直接Promise从您的model钩子中返回 jQuery + 首先进行解析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 回答