我正在尝试编写需要访问其父模型的路由。我使用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概念?
答案 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
中现在可用的模型。