2015-05-22 8 views
10

Für die Berichterstattung, möchte ich einige Metadaten mit einem Ember Route assoziieren, und würde es bevorzugen, wie folgt:Hinzufügen und Abrufen von Metadaten aus Ember Routen

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

dann Zugriff auf diese description Eigenschaft von Orten wie der Route selbst oder von anderswo, wie der didTransition Hook auf dem Anwendungs-Router. Ich habe die Quelle für Router und Route überprüft und kann nicht sagen, dass ich sie wirklich verstehe, sicherlich nicht gut genug, um zu verstehen, wie benutzerdefinierte Eigenschaften abgerufen werden, die auf diese Weise angegeben werden. Ich sehe da ist ein Objekt namens DSL, das ist offensichtlich die this der this.route in der map Methode auf Router spezifiziert, kann aber nicht sehen, wie man von hier nach dort kommt. Aus einer Unterklasse von Ember.Route sehe ich Eigenschaften genannt this.router und this.router.router, aber ich bin unklar, was diese Punkte zeigen.

Oder würde folgende auch funktionieren, wenn das mir erlaubt, zu tun, was ich wollte:

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

Kann ich assoziiere benutzerdefinierte Eigenschaften mit einer Route in Router#map angegeben, und wenn ja, wie?

+1

Ich kann sehen, Sie haben versucht, den Quellcode zu durchlaufen, um es auszuprobieren - also nehme ich an, Sie sind wohl dabei, die Standardimplementierungen von Ember.Router/Ember.Route zu erweitern/zu modifizieren und Ihre eigenen Versionen des EmberDSL - das würde viele private APIs implementieren/ändern - um das gewünschte Endziel zu erreichen. Sie müssten Ihre Implementierungen mit Änderungen in Ember auf dem neuesten Stand halten - immer sicherstellen, dass Ihre bei der Aktualisierung funktionierte. Ist das etwas, was Sie tun wollen, um das gewünschte Ergebnis zu erzielen? – jmurphyau

Antwort

0

Ich landete diese entlang der folgenden Zeilen zu lösen, meine eigene „route“ Funktion zu schreiben, die Daten aufzeichnet ich brauche, dann geht es entlang an den 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); 
} 

Verbrauch:

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

Es scheint nicht eine elegante Art und Weise zu setzen Metadaten über eine Strecke zu sein, wenn es im Router definiert ist, aber vielleicht diese hässliche Lösung in Ihrer Anwendung Controller versuchen:

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

Richtig, danke, das ist etwas, was ich vermeiden wollte. –

0

Ohne Erweitern von Embers Router besteht eine Option darin, ein separates Objekt zu haben, das Routenmetadaten beibehält. Einfaches Beispiel:

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

Um die Metadaten in den didTransition Haken zuzugreifen:

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