2013-07-07 6 views
8

親のモデルにアクセスする必要があるルートを作成しようとしています。私はthis.modelFor()を使用していますが、そのとき親モデルは完全にロードされていないので、すべてのプロパティにはnullが含まれています。Ember.jsの親ルートモデルへのアクセス

これは、2つのダイナミックセグメントと、ルータである:

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); 
    } 
}); 

アム私は何かが間違っている、または(私は疑うように)私はいくつかのエンバーの概念が欠けていますか?

答えて

6

コードのこの部分はよく見えます。ネストされたルートは、親のモデルをmodelFor経由で取得しなければならないという前提が正しい。

あなたのfindメソッドがバグの原因であると思われます。私はあなたのprevious questionを見て、私は同じGame.findがここで使用されていると仮定しています(?)

Promisesと問題があります。 Emberのルータはmodelフックの非同期性を理解しています。しかし、それはあなたの仕事を行うためにPromiseを返すことに依存しています。現在、jQueryの約束を使用していますが、gameオブジェクトを即座に初期化されていない状態に戻しています。クエリはサーバからロードされますが、その前にmodel()フックが解決されたものとみなされます。

modelからjQuery Promiseを直接返信したい場合は、まず最初に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は、(約束以外の何かを返すことによって)約束が解決されたとき、その結果がmodel()フックのモデルであることを理解しています。このgameオブジェクトは、ネストされたルートのmodelForで利用可能になるモデルです。

+0

これはまさに問題でした。面白いことに、私は昨日あなたの修正を試みたが、神はなぜ、ボードの「find」メソッドを変更し、ゲームを手つかずで間違ったままにしたのか知っている。賢い私。 私の以前の質問を見て、それを使って回答を完成させることができれば、もう一度+1します。どうもありがとうございます! –

+0

そのコードは非常に身近に見え始めていました。 :) –

関連する問題