访问Ember.js中的父路线模型

时间:2013-07-07 19:13:27

标签: javascript ember.js

我正在尝试编写需要访问其父模型的路由。我使用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);
    }
});

最后这是儿童路线,需要访问游戏模型,这就是我写的。但不管我做什么,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概念?

1 个答案:

答案 0 :(得分:6)

这部分代码看起来不错。您的假设是正确的,嵌套路由应通过modelFor获取父模型。

我怀疑你的find方法是bug的来源。我看了你的previous question,我假设这里使用的是Game.find(?)

问题与Promises有关。 Ember的路由器理解model钩子的异步性质。但它依赖于你返回Promise来完成它的工作。目前您正在使用jQuery承诺,但在其未初始化状态下立即返回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中现在可用的模型。