2015-05-25 7 views
11

Powiedzmy, że mamy składnik Aurelia o nazwie UserRouter, który jest routerem podrzędnym i obsługuje routing do UserProfile, UserImages i UserFriends.Jak przekazywać dane z komponentu routera do komponentów podrzędnych w Aurelia?

Chcę, aby UserRouter wczytał użytkownika z API (na canActivate), a następnie przekazał te dane użytkownika do podelementów.

Ładowanie danych jest w porządku, w jaki sposób przekazać je do komponentów podrzędnych, aby wszyscy mogli je przeczytać? na przykład umieszczenie atrybutu na <router-view>.

Próbowałem argumentu bindingContext w metodzie bind() dla komponentów podrzędnych, ale to nie zadziałało.

Dzięki

+0

Czy zastanawiałeś się nad wykorzystaniem wspólnego państwa? –

+2

sprawdź artykuł Patricka Waltersa [post na temat dzielenia się i przekazywania informacji] (http: // patrickwalters.net/my-best-practices-in-aurelia /) –

Odpowiedz

1

I wypracowane rozwiązanie dla tego, po prostu powiedzieć wtryskiwacz zależnościach wstrzyknąć instancję komponentu routera rodzic stosując Parent.of (YourComponent).

import {inject, Parent} from 'aurelia-framework'; 
import {UsersRouter} from './router'; 

@inject(Parent.of(UsersRouter)) 
export class UserImages { 
    constructor(usersRouter) { 
     this.usersRouter = usersRouter; 
    } 

    activate() { 
    this.user = this.usersRouter.user; 
    } 
} 

Można również naprawdę przegapić Parent.of część, ponieważ system Aurelia DI działa w górę.

import {inject} from 'aurelia-framework'; 
import {UsersRouter} from './router'; 

@inject(UsersRouter) 
export class UserImages { 
    constructor(usersRouter) { 
     this.usersRouter = usersRouter; 
    } 

    activate() { 
    this.user = this.usersRouter.user; 
    } 
} 
+1

Uważaj, jeśli opuścisz 'UsersRouter', a następnie przejdziesz z powrotem, możesz uzyskać stary router, a nie nowy, ponieważ' UsersRouter' może być zależny od zależności klasa statyczna dożywotnia, co oznacza, że ​​pierwsza utworzona instancja jest tą, która będzie zależeć od zastrzyków wszędzie. –

2

Można użyć event aggregator publikować na imprezę z danych i elementów podrzędnych mógłby subskrybowania i nasłuchiwać tego zdarzenia. To pozwoliłoby uniknąć sprzężenia między nimi. Jednak może nie być wadą, o której nie myślę.

+0

lub używanie arelia-flux, co jest mniej więcej tym samym, ale trochę ładniejszym imho –

3

Można powiązać obiekt routera/użytkownika do <router-view>

<router-view router.bind="router"></router-view>

Mam ten sam problem, więc chciałbym zobaczyć, co można wymyślić !!

6

Sposób, w jaki to zrobił, był przez dodanie dodatkowych informacji do np dziecko definicji Router:

configureRouter(config, router){ 
    config.map([ 
    { route: [''], name: 'empty', moduleId: './empty', nav: false, msg:"choose application from the left" }, 
    { route: 'ApplicationDetail/:id', name: 'applicationDetail', moduleId: './applicationDetail', nav: false, getPickLists :() => { return this.getPickLists()}, notifyHandler :()=>{return this.updateHandler()} } 
]); 

w pierwszej trasie z tego przykładu, mijam w wiadomości tekstowej, dodając własne porperty „msg "do obiektu trasy. na drugiej trasie mijam niektóre programy obsługi zdarzeń, ale mogły to być niektóre obiekty niestandardowe lub inne.

W childmodel otrzymam te dodatkowe elementy w metodzie activate():

export class empty{ 
    message; 

    activate(params, routeconfig){ 
    this.message=routeconfig.msg || ""; 
    } 
} 

Chyba w twoim przypadku, należy dodać obiekt użytkownika do definicji routera dziecko.

+1

w tym przypadku, jak możemy uczynić metodę getPickLists dwukierunkową, tzn. Wszystko, co zmieniono w liście wyboru w ścieżce podrzędnej, może być odzwierciedlone w rodzicu jako dobrze? –

0

można zaimplementować metoda rodzajowa do przekazywania obiektów:

configureRouter(config, router){ 
    this.router = router; 
    ... 

    this.router.navigateWithParams = (routeName, params) => { 
     let routerParams = this.router.routes.find(x => x.name === routeName); 
     routerParams.data = params; 
     this.router.navigate(routeName); 
    } 

} 

następnie można użyć go programowo jak:

goToSomePage(){ 
    let obj = { someValue: "some data", anotherValue: 150.44} 
    this.router.navigateWithParams("someRoute", obj); 
} 

Wreszcie, można uzyskać param na stronie docelowej:

activate(urlParams, routerParams) 
{ 
     this.paramsFromRouter = routerParams.data; 
} 
+0

wygląda tak, jak nazwa metody zmieniła this.router.navigateToRoute ('someRoute' ', obj); – Aligned

Powiązane problemy