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