Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/457.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在Ember.js中访问父路由模型_Javascript_Ember.js - Fatal编程技术网

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

您希望直接从
模型中返回jQuery
Promise
,然后在第一个
中执行解析,并将其作为结果返回

这是您修改的
游戏。查找
。同样的原则也适用于其他发现者

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
中使用的模型。

这正是问题所在。有趣的是,我昨天尝试了你的修改,但是,天知道为什么,我只改变了Board
find
方法,让游戏保持原样并且出错。聪明的我。顺便说一句,如果可以的话,我会给你另一个+1,因为我不厌其烦地看了我前面的问题,并用它来完成答案。非常感谢你!