簡體   English   中英

訪問Ember.js中的父路線模型

[英]Accessing parent route model in 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'});
        });
    });
});

這是我的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概念?

這部分代碼看起來不錯。 您的假設是正確的,嵌套路由應通過modelFor獲取父模型。

我懷疑你的find方法是bug的來源。 我查看了你之前的問題 ,我假設同樣的Game.find在這里使用(?)

問題與Promises Ember的路由器理解model鈎子的異步性質。 但它依賴於你返回一個Promise去做它的工作。 目前您正在使用jQuery承諾,但立即返回game對象的未初始化狀態。 查詢從服務器加載,但假定model()掛鈎在此之前已解析。

你想直接從model鈎子返回jQuery Promise +在第一個中then解析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()鈎子的model() game對象是現在可在嵌套路徑中的modelFor中使用的模型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM