Cés*_*pia 8 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'});
});
});
});
Run Code Online (Sandbox Code Playgroud)
这是我的GameRoute,完美运作:
MGames.GameRoute = Ember.Route.extend ({
model: function (params) {
return MGames.Game.find(params.game_id);
}
});
Run Code Online (Sandbox Code Playgroud)
最后这是儿童路线,谁需要访问游戏模型,这就是我写的.但不管我做什么,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);
}
});
Run Code Online (Sandbox Code Playgroud)
我做错了什么,或者(我怀疑)我错过了一些Ember概念?
这部分代码看起来不错.你的假设是正确的,嵌套路线应该得到父通过的模型modelFor.
我怀疑你的find方法是bug的来源.我看了你以前的问题,我假设在Game.find这里使用了同样的问题(?)
问题在于Promises.Ember的路由器理解model钩子的异步性质.但它依赖于你回来Promise做它的工作.目前您正在使用jQuery承诺,但game在其未初始化状态下立即返回对象.查询从服务器加载,但model()假定钩子在此之前已解决.
你想直接Promise从你的model钩子返回jQuery +在第一个中进行解析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;
});
}
Run Code Online (Sandbox Code Playgroud)
请注意,游戏对象按原样返回.Ember理解当promise被解决时(通过返回除promise之外的任何东西),该结果就是model()钩子的模型.此game对象是现在可在modelFor嵌套路径中使用的模型.
| 归档时间: |
|
| 查看次数: |
3337 次 |
| 最近记录: |