2013-08-05 7 views
10

Data la seguente applicazione Ember.js (utilizzando Ember 1.0.0.rc.6.1 e Ember dati 0,13):Perché le risorse nidificate in Ember.js non conservano l'hash dei parametri?

App = Ember.Application.create({ LOG_TRANSITIONS: true }); 

App.Store = DS.Store.extend(); 

App.Router.map(function() { 
    this.resource('promotions', function() { 
     this.resource('promotion', { path: '/:promotion_id' }, function() { 
      this.resource('entrants', function() { 
       this.resource('entrant', { path: '/:entrant_id' }); 
      }); 
     }); 
    }); 
}); 

App.PromotionRoute = Ember.Route.extend({ 
    model: function() { 
     return { id: 1, name: 'My Promotion' }; 
    } 
}); 

App.EntrantsIndexRoute = Ember.Route.extend({ 
    model: function(params) { 
     console.warn('EntrantsIndexRoute', '\nparams:', params, '\nparams.promotion_id:', params.promotion_id, '\narguments:', arguments); 
     console.log('params should be:', { promotion_id: 1 }); 
     console.log('The queried URL should be:', '/entrants?promotion_id=1'); 
     return App.Entrant.find({promotion_id: params.promotion_id}); 
    } 
}); 

App.Entrant = DS.Model.extend({ 
    name: DS.attr('string') 
}); 

Se si inserisce l'url #/promotions/1/entrants, che dovrebbe essere una risorsa nidificato, i params è un oggetto vuoto. Come posso accedere a promotion_id lì? JSFiddle qui, dai un'occhiata alla console dopo aver cliccato su "Click me": http://jsfiddle.net/Kerrick/4GufZ/

risposta

20

Mentre non puoi accedere ai segmenti dinamici del percorso principale, puoi comunque recuperare il modello per il percorso principale e ottenere il suo ID , in questo modo:

App.EntrantsIndexRoute = Ember.Route.extend({ 
    model: function() { 
    var promotion_id = this.modelFor('promotion').id; 
    return App.Entrant.find({ promotion_id: promotion_id }); 
    } 
}); 

Oppure, se v'è una ha-molti relazione tra la promozione e partecipanti, si potrebbe fare anche:

App.EntrantsIndexRoute = Ember.Route.extend({ 
    model: function() { 
    return this.modelFor('promotion').get('entrants'); 
    } 
}); 
+4

È da qualche parte nelle guide di Brace? Non riuscivo a trovarlo da nessuna parte ... – claptimes

+5

Questa risposta sembra dare una soluzione, ma non risponde alla domanda di fondo del perché la risorsa nidificata non ha accesso ai parametri – Hortitude

+0

Questa risposta è rilevante solo se sei seguendo un caso d'uso simile. se il tuo modello non è così semplice come questo esempio, non risponde ancora alla domanda su come ottenere parametri da una rotta nidificata. – cspray

0

provare questo codice:

App.EntrantsIndexRoute = Ember.Route.extend({ 
    model: function() { 
    var promotion_id = this.modelFor('promotion').query.promotion_id; 
    return App.Entrant.find({ promotion_id: promotion_id }); 
    } 
});