2015-05-22 9 views
10

Ai fini dei rapporti, voglio associare alcuni metadati con un percorso Ember, e preferirebbero farlo come segue:Aggiunta e recupero dei metadati da percorsi Ember

this.route('list', { path: '/list', description: 'Master List' }); 

quindi accedere a questa proprietà description da posti come il instradare se stesso o altrove, ad esempio il gancio didTransition sul router dell'applicazione. Ho esaminato il sorgente per Router e Route e non posso dire di averlo compreso appieno, certamente non abbastanza bene da capire come recuperare le proprietà personalizzate specificate in questo modo. Vedo che c'è un oggetto chiamato DSL, che è apparentemente lo this dello this.route specificato nel metodo map su Router, ma non riesco a vedere come arrivare da qui a lì. Dall'interno di una sottoclasse di Ember.Route, vedo le proprietà chiamate this.router e this.router.router, ma non sono chiaro su cosa puntino a questo.

Oppure, quanto segue potrebbe anche funzionare se questo mi ha permesso di fare quello che volevo:

this.route('list', { path: '/list' }, function() { 
    this.description = "Master List"; 
}); 

Posso associare le proprietà personalizzate con un percorso specifico in Router#map, e se sì, come?

+1

Vedo che hai tentato di passare attraverso il codice sorgente per provare a risolverlo - quindi prendo il fatto che sei a tuo agio nell'estendere/modificare le implementazioni predefinite di Ember.Router/Ember.Route e implementare le tue versioni del EmberDSL - che implementerebbe/modificherà molte API private - per ottenere l'obiettivo finale che stai cercando. Dovresti mantenere aggiornate le tue implementazioni con le modifiche in Ember - assicurandoti sempre che il tuo abbia funzionato quando hai aggiornato. È qualcosa che sei disposto a fare per ottenere il risultato che desideri? – jmurphyau

risposta

0

ho finito per la soluzione di questo secondo le seguenti linee, scrivere il mio funzione "percorso" che registra i dati che ho bisogno, quindi lo passa lungo il DSL:

var myRouteData = {}; 

function route(dsl, name, options, fn) { 
    if (typeof options === 'function') fn = options, options = {}; 
    var routeName = dsl.parent ? dsl.parent + '.' + name : name; 
    myRouteData[routeName] = { options.myRouteOption }; 

    dsl.route(name, options.fn); 
} 

Usage:

this.resource('foo', function() { 
    route(this, 'bar', {myRouteOption: true}); 
}); 
2

Non sembra essere un modo elegante per impostare i metadati di un percorso quando si è definito nel router, ma forse provare questa brutta soluzione entro il controller dell'applicazione:

currentPathChange: function() { 
    switch(this.get('currentPath')){ 
    case 'test.index': 
     console.log('test.index is the foo!'); 
     break; 
    case 'test.new': 
     console.log('test.new is the bar!'); 
     break; 
    } 
}.observes('currentPath') 

JSBin DEMO

+0

Bene, grazie, è una specie di cosa stavo cercando di evitare. –

0

Senza estendere il router di Ember, un'opzione è di avere un oggetto separato che mantiene i metadati della rotta. Esempio semplice:

this.route('list', { path: '/list' }); 
routeMetaData['list'] = 'Master List'; 

Per accedere i metadati nel gancio didTransition:

didTransition: function() { 
    var metadata = routeMetaData[this.routeName]; 
}