2013-07-07 63 views
8

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

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

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

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); 
    } 
}); 

我做得不对,或者(我怀疑),我错过了一些灰烬概念?

回答

6

这部分代码看起来不错。你的假设是正确的,嵌套的路线应该通过modelFor得到父母的模型。

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

问题是与Promises有关。 Ember的路由器了解model钩子的异步性质。但它依靠你返回一个Promise做它的工作。目前,您正在使用jQuery承诺,但立即返回game对象处于未初始化状态。查询从服务器加载,但假设model()挂钩在发生此问题之前已解决。

你想直接从你的model挂钩返回jQuery Promise +在第一个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明白,当承诺解决时(通过返回除承诺之外的任何东西),该结果就是model()挂钩的模型。这个game对象是现在将在嵌套路由中的modelFor中可用的模型。

+0

这正是问题所在。有趣的是,我昨天尝试了你的修改,但是,上帝知道为什么,我只改变了棋盘的“发现”方法,并且保持了游戏的一触即发和错误。聪明我。 顺便说一句,如果我可以煞费苦心地查看我之前的问题并用它来完成答案,我会再给你一个+1。非常感谢! –

+0

该代码开始显得非常熟悉。 :) –