Javascript 在Ember.js中访问父路由模型
我正在尝试编写一个需要访问其父模型的路由。我使用Javascript 在Ember.js中访问父路由模型,javascript,ember.js,Javascript,Ember.js,我正在尝试编写一个需要访问其父模型的路由。我使用this.modelFor(),但是当我这样做时,父模型并没有完全加载,所以它的所有属性都包含null 这是路由器,有两个动态段: MGames.Router.map(函数(){ 此.resource('games',function(){ this.resource('game',{path:'/:game_id'},函数(){ 资源('board',{path:'/boards/:board_id'}); }); }); }); 这是我的游戏
this.modelFor()
,但是当我这样做时,父模型并没有完全加载,所以它的所有属性都包含null
这是路由器,有两个动态段:
MGames.Router.map(函数(){
此.resource('games',function(){
this.resource('game',{path:'/:game_id'},函数(){
资源('board',{path:'/boards/:board_id'});
});
});
});
这是我的游戏路线,他工作完美:
MGames.GameRoute=Ember.Route.extend({
型号:功能(参数){
返回MGames.Game.find(params.Game_id);
}
});
最后这是孩子的路线,他们需要访问游戏模型,这就是我写的。但是不管我做什么,console.log()
总是打印null
。如果我检查game
变量,则isLoad
属性始终为空:
MGames.BoardRoute=Ember.Route.extend({
型号:功能(参数){
var game=this.modelFor('game');
console.log(game.get(“id”);
返回MGames.Board.find(game.get(“id”)、params.Board_id);
}
});
我是否做错了什么,或者(正如我所怀疑的)我缺少了一些余烬概念?这部分代码看起来不错。您的假设是正确的,嵌套路由应该通过
modelFor
获取父级的模型
我怀疑你的find方法是这个bug的根源。我看了你的,我假设相同的游戏。这里使用find
()
问题在于承诺
。Ember的路由器了解模型
钩子的异步性质。但是,它依赖于您返回一个承诺来完成它的工作。目前,您正在使用jQuery承诺,但在未初始化状态下立即返回game
对象。查询从服务器加载,但假定在此之前已解决model()
hook
您希望直接从模型中返回jQueryPromise
,然后在第一个中执行解析,并将其作为结果返回
这是您修改的游戏。查找。同样的原则也适用于其他发现者
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()
hook的模型。这个game
对象就是现在可以在嵌套路线的modelFor
中使用的模型。这正是问题所在。有趣的是,我昨天尝试了你的修改,但是,天知道为什么,我只改变了Boardfind
方法,让游戏保持原样并且出错。聪明的我。顺便说一句,如果可以的话,我会给你另一个+1,因为我不厌其烦地看了我前面的问题,并用它来完成答案。非常感谢你!