2013-03-19 9 views
16

Ember.Route.model ha accesso alla variabile params, ma non lo è Ember.Route.setupController. Ciò è problematico per me, perché il mio percorso ha più segmenti dinamici e ho bisogno di usarli tutti nel mio modello.Qual è il modo corretto per accedere ai parametri da Ember.Route. setupController?

In particolare, il mio percorso è il seguente: /project/:project_id/task/:task_id. Nota che un'attività può appartenere a molti progetti, non solo a uno. Pertanto non possiamo dire quale progetto stiamo guardando osservando l'attività stessa: dobbiamo utilizzare l'ID del progetto trovato nell'URL. Ecco come lo sto facendo attualmente:

App.TaskRoute = Ember.Route.extend({ 

    // This works just fine: 
    serialize: function(model) { 
    return { 
     task_id: model.get('id'), 
     project_id: this.modelFor('project').get('id') 
    }; 
    }, 

    model: function(params) { 
    this.set('parentProjectId', params.project_id); 

    return App.Task.find(params.task_id); 
    }, 

    setupController: function(controller, model) { 
    var parentProject = this.modelFor('project') ? 
         this.modelFor('project') : 
         App.Project.find(this.get('parentProjectId')); 
    controller.set('parentProject', parentProject); 

    controller.set('content', model); 
    } 
}); 

Forse sono un paranoico, questo mi sembra un po 'hacky. Se il percorso doveva consentire l'accesso ai parametri, avrebbe già una proprietà collegata ad esso. C'è un modo migliore?

MODIFICA: Ho apportato qualche aggiornamento al codice sopra. Inoltre, le mie route hanno questo aspetto:

App.Router.map(function() { 
    this.resource('project', { path: '/project/:project_id' }); 
    this.resource('task', { path: 'project/:project_id/task/:task_id' }); 
}); 

risposta

10

Non hai accesso a questi parametri nel gancio setupController. Il hook del modello ha accesso a un oggetto params, perché è appena chiamato, quando la tua app viene inserita tramite URL.

Il tuo codice sembra abbastanza bello, lo sai davvero, che vuoi farlo in questo modo. Cosa ti fa l'hacker a riguardo? Quando osservo questo codice, mi chiedo perché non hai diviso la logica del tuo percorso in un ProjectRoute e un TaskRoute subordinato. Non funzionerebbe per te?

Aggiornamento: Risposta alle modifiche

risorse nidificazione è probabile che la chiave del successo nel tuo caso:

App.Router.map(function() { 
    this.resource('project', { path: '/project/:project_id' }, function(){ 
    this.resource('task', { path: '/task/:task_id' }); 
    }); 
}); 

Dal momento che il TaskRoute non è annidato bisogna rinominarlo in ProjectTaskRoute:

App.ProjectTaskRoute = Ember.Route.extend({ 
... 
}); 

Ciò dovrebbe consentire di rimuovere parentProjectId property dal percorso.

+0

Ah, non ero a conoscenza del fatto che il metodo del modello viene chiamato solo al primo caricamento, ma spiega un sacco di stranezza che ho visto. Ad esempio, il mio codice sopra non funziona se apro/project/1/tasks/2 direttamente, perché 'model' non viene chiamato, quindi l'attributo' parentProjectId' non è impostato. In tal caso, devo eseguire 'var parentProject = this.modelFor ('project')' all'interno di 'setupController'. Ho un ProjectRoute separato. Apertura/progetto/1 mostrerà le attività per un progetto. Facendo clic su un'attività si aprirà/project/1/tasks/1. La vista attività ha bisogno di un collegamento al progetto, quindi sto tirando il progetto dall'URL. – NudeCanalTroll

+0

Quindi funziona adesso? La mia idea era anche di usare this.modelFor ("progetto"). Quando inserisci la tua app tramite/project/1/tasks/2, ProjectRoute dovrebbe essere colpito per primo e il suo hook del modello. Successivamente è possibile utilizzare modelFor per accedervi. Ci si sente solo un po 'ridondanti per impostare il genitoreProject nel controller, quando si utilizzano i dati ember per modellare i dati. Non dovrebbe esistere quella proprietà sul tuo TaskModel? – mavilein

+0

Un'attività può appartenere a più progetti (pensare a progetti come tag), quindi invece di avere un'associazione "appartiene al progetto" è un'associazione "ha molti progetti". Quindi, non posso dire quale progetto sono all'interno (e quindi dove il pulsante back dovrebbe collegarsi a) solo osservando l'attività. Devo controllare l'URL. Ad ogni modo, proverò il modello per la cosa. Penso di avere i miei percorsi impostati in modo errato, quindi andare a/project/1/task/2 sta colpendo prima TaskRoute.Penso di aver bisogno di annidare i miei percorsi di attività all'interno delle mie rotte di progetto? Aggiornerò la mia domanda per mostrare come sono i miei percorsi. – NudeCanalTroll

Problemi correlati