2013-07-07 20 views
8

Próbuję zapisać trasę, która wymaga dostępu do modelu jej rodzica. Używam this.modelFor(), ale kiedy to robię, model rodzica nie jest całkowicie załadowany, więc wszystkie jego właściwości zawierają null.Uzyskiwanie dostępu do nadrzędnego modelu trasy w Ember.js

Jest to router z dwóch dynamicznych segmentów:

MGames.Router.map(function() { 
    this.resource('games', function() { 
     this.resource ('game', {path: '/:game_id'}, function() { 
      this.resource('board', {path: '/boards/:board_id'}); 
     }); 
    }); 
}); 

To mój GameRoute, który działa perfekcyjnie:

MGames.GameRoute = Ember.Route.extend ({ 
    model: function (params) { 
     return MGames.Game.find(params.game_id); 
    } 
}); 

I wreszcie jest to trasa dla dzieci, które potrzebują dostępu do Model gry, i to jest to, co napisałem. Ale nie ma znaczenia, co robię, zawsze drukuje . Gdybym sprawdzić zmienną game właściwość isLoad jest zawsze zerowa:

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

robię coś źle, albo (jak podejrzewam) Brakuje mi jakąś koncepcję Ember?

Odpowiedz

6

Ta część kodu wygląda dobrze. Twoje założenia są poprawne, ponieważ trasa zagnieżdżona powinna uzyskać model rodzica poprzez modelFor.

Podejrzewam, że Twoja metoda wyszukiwania jest źródłem błędu. Spojrzałem na twoje previous question i zakładam, że ten sam Game.find jest tu użyty (?)

Problem dotyczy wersji Promises. Router Ember rozumie asynchroniczną naturę haka model. Ale to zależy od tego, czy zwrócisz Promise, aby to działało. Obecnie używasz obietnicy jQuery, ale zwracasz obiekt game natychmiast w niezainicjowanym stanie. Zapytanie ładowane z serwera, ale zakłada się, że hak model() został rozwiązany, zanim to nastąpi.

Chcesz bezpośrednio zwrócić jQuery Promise z haka model + Wykonaj parsowanie w pierwszym then i zwróć to jako wynik.

Oto zmodyfikowany Game.find. Te same zasady odnoszą się do innych poszukiwaczy.

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

Zwróć uwagę, że obiekt gry jest zwracany bez zmian. Ember rozumie, że gdy obietnica zostanie rozwiązana (poprzez zwrot czegoś innego niż obietnicę), wynikiem jest model haka model(). Ten obiekt game jest modelem, który będzie teraz dostępny w modelFor w zagnieżdżonej trasie.

+0

To był dokładnie problem. Zabawne jest to, że wczoraj próbowałem twojej modyfikacji, ale, nie wiem dlaczego, zmieniłem tylko metodę "znajdź", a opuściłem ją nietkniętą i niesłuszną. Sprytnie. Przy okazji, dałbym ci kolejne +1, gdybym mógł zająć się sprawą poprzedniego pytania i użyć go do uzupełnienia odpowiedzi. Dziękuję bardzo! –

+0

Ten kod zaczyna wyglądać znajomo. :) –

Powiązane problemy