2013-01-13 4 views
17

Mi piacerebbe un percorso Ember /clinic/1 per reindirizzare automaticamente per mostrare il primo medico: /clinic/1/doctor/1.Ember - Reindirizza automaticamente a firstObject

Ogni clinica ha molti medici.

Purtroppo se uso questo codice:

var doctor = clinicController.get('content.doctors.firstObject'); 
router.transitionTo('clinic.doctor.index', doctor); 

... non funziona, come content.doctors.length è ancora 0 quando questo codice viene eseguito in app_router.js.

Qualche idea?

+0

Quale versione di brace si usa? Penso che questo codice sia prima del nuovo routing. Ad ogni modo, potrebbe fare un jsfiddle o jsbin che mostra l'esempio? –

risposta

24

Si dovrebbe essere in grado di fare questo:

App.DoctorsRoute = Ember.Route.extend({ 
    model: function() { 
    return App.Doctor.find(); 
    }, 

    redirect: function() { 
    var doctor = this.modelFor('doctors').get('firstObject'); 
    this.transitionToRoute('doctor', doctor); 
    } 
}); 

Ciò funzionerà perché:

  • Se il gancio modello restituisce un oggetto che non ha ancora caricato, il resto dei ganci vinto eseguire finché il modello non è completamente caricato.
  • Se le transizioni gancio redirect su un'altra route, il resto dei ganci non verrà eseguito.

Si noti che a partire da 2426cb9, è possibile interrompere l'implicito .index durante la transizione.

+2

No scherzo - l'uomo stesso! Grazie Yehuda :) –

+0

È ancora supponiamo di lavorare con ember 1.0.0rc2? Ricevo sempre 'this.modelFor ('medici'). Get ('length')' a 0. –

+1

Sto provando questo approccio ma non sembra funzionare sul carico iniziale. Credo che questo sia dovuto al fatto che i dati non sono ancora stati caricati. Tuttavia, se si allontana e si ritorna, funzionerà poiché in quel momento i dati sono stati caricati. qualche consiglio @Yahuda? – Ben

2

Riorientare sulla Strada non funziona per me nella mia brace-data un'applicazione basata come i dati non viene caricato al punto di reindirizzamento, ma questo funziona per me ...

Nei ruoli transizione del controller I nella route del ruolo per il firstObject caricato.

Application.RolesController = Ember.ArrayController.extend({ 

    selectFirstObject: function() { 
     if (this.get('content').get('isLoaded')) { 
      var role = this.get('firstObject'); 
      this.transitionToRoute('role', role); 
     } 
    }.observes('content.isLoaded') 

}); 

HTH, gerry

1

come aggiornamento, se non si desidera reindirizzare perché si ha un percorso nidificato, ti consigliamo di utilizzare reindirizzamento condizionale basata sulla rotta prevista.

redirect ha passato due argomenti, il modello e l'oggetto di transizione. La transizione ha la proprietà targetName in cui è possibile reindirizzare condizionatamente in base al relativo valore.

redirect: function(model, transition){ 
    if(transition.targetName ==='doctors.index'){ 
    this.transitionTo('doctor', model.get('firstObject')); 
    } 
} 
1

Per gli utenti EmberCLI, devi ottenere lo stesso nel modo seguente:

//app/routes/clinics/show.js 
import Ember from 'ember'; 

export default Ember.Route.extend({ 
    redirect: function(model) { 
    var firstDoctor = model.get('doctors.firstObject'); 
    this.transitionTo('doctor', firstDoctor); 
    } 
});