2015-05-12 18 views
6

Muszę zastosować "aktywną" klasę do zakładki ładowania początkowego w zależności od aktualnej nazwy trasy. Obiekt trasy zawiera "routeName", ale jak uzyskać do niego dostęp z kontrolera lub komponentu?Dostęp do aktualnej nazwy trasy z kontrolera lub komponentu

+1

Może to this.controllerFor ('application'). Get ('currentRouteName') – blessenm

+0

@blessenm yep, to jest właśnie to, co chcę – jax

+0

Ember zrobi to za Ciebie. po prostu użyj linku-do na twoich zakładkach – killebytes

Odpowiedz

2

Dla Ember 2 ze sterownika można spróbować:

appController: Ember.inject.controller('application'), 
currentRouteName: Ember.computed.reads('appController.currentRouteName') 

Następnie można przekazać do komponentu.

4

W absolutnie rozpaczliwym przypadku można wyszukać router lub kontroler aplikacji (który ujawnia właściwość currentRouteName) za pośrednictwem this.container.lookup("router:main") lub this.container.lookup("controller:application") z poziomu komponentu.

Gdyby to był wspólny trend, wykonałbym usługę CurrentRouteService i wstrzyknęłabym ją do mojego komponentu (-ów), dzięki czemu będę mógł łatwiej kpić z moich testów.

Może być również lepsza odpowiedź, ale przyjdź do kontenera.lookup(), aby usunąć obecny bloker.

+3

Powraca dla mnie niezdefiniowana: 'this.container.lookup (" router: main ").get ('currentRouteName') ' – jax

9

Użyj tego this.controllerFor('application').get('currentRouteName');

+4

Czy działa to z komponentu? – Huafu

+0

@ Huuu Powinien działać w Ember 1. Nie jestem pewien co do embera 2. Nie pracowałam w ember przez jakiś czas. Ale myślę, że tak nie będzie, odkąd kontrolerzy zostaną zastąpieni na korzyść elementów rutowanych w ember 2. Nie jestem nawet pewien, czy ruszyli w tym kierunku. Ale byłoby wspaniale, gdybyś mógł zaktualizować tutaj, gdybyś znalazł alternatywę. – blessenm

+0

Nie, miałem na myśli, 'controllerFor' jest publiczną metodą' Ember.Route', w Ember 2 jest również prywatną statyczną metodą 'Ember', ale nie sądzę, że jest to metoda' Ember.Component ', nawet prywatne. Innymi słowy, działałoby to z trasy, ale nie ze składnika, ponieważ 'controllerFor' nie jest tam dostępny. – Huafu

1

Spróbuj tego.

export default Ember.Route.extend({ 
 
    routeName: null, 
 
    
 
    beforeModel(transition){ 
 
    //alert(JSON.stringify(transition.targetName) + 'typeof' + typeof transition.targetName); 
 
    this.set('routeName', transition.targetName); 
 
    }, 
 
    model(){ 
 

 
    // write your logic here to determine which one to set 'active' or pass the routeName to controller or component 
 
    }

`

1

W rzeczywistości, nie trzeba stosować aktywną klasę sam. Pomocnik link-to zrobi to za Ciebie.

Zobacz here:

{{link-to}} zastosuje nazwę klasy CSS z „aktywny”, gdy aktualna trasa w aplikacji odpowiada dostarczonego routeName. Na przykład, jeśli aktualna trasa danej aplikacji jest 'photoGallery.recent' następujące wykorzystanie {{link-to}}:

{{#link-to 'photoGallery.recent'}} 
    Great Hamster Photos 
{{/link-to}} 

spowoduje

<a href="/hamster-photos/this-week" class="active"> 
    Great Hamster Photos 
</a> 
+0

Takie świetne użycie 'link-to'! –

0

Wykorzystując spostrzeżenia z odpowiedzi @ maharaja-santhira, można pomyśleć o ustawieniu właściwości routeName na kontrolerze docelowym do użycia np. W szablonie celu. W ten sposób nie ma potrzeby definiowania logiki w wielu lokalizacjach, a tym samym ponownego użycia kodu. Oto przykład jak to osiągnąć:

// app/routes/application.js 
export default Ember.Route.extend({ 
    ... 

    actions: { 
     willTransition(transition) { 
      let targetController = this.controllerFor(transition.targetName); 
      set(targetController, 'currentRouteName', transition.targetName); 
      return true; 
     } 
    } 
}); 

Definiowanie tego willTransition działania w trasie Aplikacja pozwala na propagowanie obecną nazwę trasy do dowolnego miejsca w aplikacji. Należy zauważyć, że kontroler docelowy zachowa ustawienie właściwości currentRouteName nawet po przejściu na inną trasę. W razie potrzeby wymaga to ręcznego czyszczenia, ale może być dopuszczalne w zależności od implementacji i użycia.

Powiązane problemy