2015-05-22 20 views
10

Dla celów sprawozdawczych, chcę kojarzyć pewne metadane z trasy Ember, i wolałaby, aby to zrobić w następujący sposób:Dodawanie i pobieranie metadanych z tras Ember

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

wtedy dostęp do tej description nieruchomość od miejsc takich jak sama trasa lub z innego miejsca, na przykład hak didTransition na routerze aplikacji. Sprawdziłem źródło dla routera i trasy i nie mogę powiedzieć, że naprawdę to rozumiem, na pewno nie na tyle dobrze, aby zrozumieć, jak pobierać niestandardowe właściwości określone w ten sposób. Widzę obiekt o nazwie DSL, który jest prawdopodobnie this z this.route określony w metodzie map na Router, ale nie może zobaczyć, jak dostać się stąd do tego miejsca. Z podklasy Ember.Route widzę właściwości o nazwach this.router i this.router.router, ale nie jestem pewien, na co one wskazują.

Albo dodaje również, że jeśli praca pozwoliła mi zrobić to, co chciałem:

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

mogę powiązać właściwości niestandardowe z trasą określoną w Router#map, a jeśli tak, to w jaki sposób?

+1

Widzę, że próbujesz przejść przez kod źródłowy, aby spróbować go przetestować - więc przyjmę, że wygodnie rozszerzasz/modyfikujesz domyślne implementacje Ember.Router/Ember.Route i implementujesz własne wersje EmberDSL - który implementowałby/zmieniałby wiele prywatnych API - aby osiągnąć cel końcowy, którego szukasz. Będziesz musiał aktualizować swoje implementacje ze zmianami w Ember - zawsze upewniając się, że twoja działała po aktualizacji. Czy jest to coś, co chcesz zrobić, aby uzyskać pożądany rezultat? – jmurphyau

Odpowiedz

0

skończyło się na rozwiązywaniu tego zgodnie z poniższymi wytycznymi, pisząc własną funkcję „Trasa”, która rejestruje dane mi potrzeba, a następnie przekazuje ją wraz z 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); 
} 

Zastosowanie:

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

Nie wydaje się być elegancki sposób ustawić metadane na temat trasy, gdy jest on zdefiniowany w routerze, ale może spróbować tego brzydkiego rozwiązanie wewnątrz kontrolerze aplikacji:

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

Dobrze, dzięki, tego właśnie próbowałem uniknąć. –

0

Bez rozbudowy routera Ember, jedną z opcji jest posiadanie oddzielnego obiektu, który utrzymuje metadane trasy. Prosty przykład:

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

Aby uzyskać dostęp do metadanych w haku didTransition:

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