2016-02-18 25 views
22

Bu sorunu nasıl çözeceğime dair bazı tavsiyelerde bulunabilirim. senin için bir ana bileşeni oluşturduk bu mümkün olan en iyi açıklamak için:Açısal 2 geçiş nesnesi, rota paramları ile mümkün mü?

@Component({ 
selector: 'main-component', 
providers: [...FORM_PROVIDERS, MainService, MainQuoteComponent], 
directives: [...ROUTER_DIRECTIVES, CORE_DIRECTIVES, RouterOutlet, MainQuoteComponent ], 
styles: [` 
    agent { 
     display: block; 
    } 
`], 
pipes: [], 
template: ` 
    **Html hidden** 
    `, 
    bindings: [MainService], 
}) 

@RouteConfig([ 
    { path: '/', name: 'Main', component: MainMenuComponent, useAsDefault: true }, 
    { path: '/passenger', name: 'Passenger', component: PassengerComponent }, 
]) 

@Injectable() 
export class MainComponent { 

bookingNumber: string; 
reservation: Reservation; 
profile: any; 

constructor(params: RouteParams, public mainService: MainService) { 

    this.bookingNumber = params.get("id"); 

    this.mainService.getReservation(this.bookingNumber).subscribe((reservation) => { 

     this.reservation = reservation; 
    }); 

    this.profile = this.mainService.getUserDetails(); 

} 

} 

Bu bileşen API gelen rezervasyon Retreive ve gördüğünüz rezervasyon nesne kaydetmek (Bir sınıf Rezervasyon türü vardır Ben düğme yolcu tıkladığınızda, O yolcu sayfa Ana/yolcu yönlendirilecek

export class Reservation { 

constructor(
    public Id: number, 
    public BookingNumber: string, 
    public OutboundDate: Date, 
    public ReturnDate: Date, 
    public Route: string, 
    public ReturnRoute: string, 
    public Passengers: string, 
    public Pet: string, 
    public VehicleType: string, 
    public PassengersList: Array<Passengers> 

) { } 
} 

) şöyle, ama burada (rezervasyon nesnesi (bütün bir) ya da sadece YolcuListesi göndermek için diziyi gerek).

Bunu, rota paramları veya yönlendirici çıkışı ile yapmanın mümkün olup olmadığını biliyor musunuz? Baska öneri?

cevap

30

Sadece paylaşılan bir hizmet kullanın ve ana bileşenin providers: [...] numarasına ekleyin.

Basit hizmet sınıfı ebeveyn olarak

@Injectable() 
export class ReservationService { 
    reservation:Reservation; 
} 

sağlayıcıları eklemek ve sadece (sağlayıcılarına katmayan) enjekte çocuk bileşeninde yapıcısı

@Component({... 
    providers: [ReservationService] 
export class Parent { 
    constructor(private reservationService:ReservationService) {} 

    someFunction() { 
    reservationService.reservation = someValue; 
    } 
} 

içinde enjekte

@Component({... 
    providers: [] 
export class Passenger { 
    constructor(private reservationService:ReservationService) { 
    console.log(reservationService.reservation); 
    } 

    someFunction() { 
    reservationService.reservation = someValue; 
    } 
} 

güncelleme

bootstrap(), her şeyin ve geçerli bir seçeneğin ortak atasıdır. Tam gereksinimlerinize göre değişir. Bir bileşende sağlarsanız, bu bileşen, tek bir örneği paylaşan ağacın kökü haline gelir. Bu şekilde bir servisin kapsamını belirtebilirsiniz. Kapsam "uygulamanızın tamamı" olmalıysa, bootstrap() veya kök bileşenini sağlayın. Angular2 stil kılavuzu, bootstrap() üzerinde kök bileşeninin providers lehine teşvik eder. Sonuç yine de aynı olacaktır. A bileşeni ile <router-outlet> ürününe eklenen diğer bileşenler arasında iletişim kurmak istiyorsanız, bu bileşenin kapsamını A ile sınırlamak mantıklı olacaktır.

+0

Hızlı cevabınız için Thsnks .. Akşamına bakacağız. – Mandersen

+0

2 saat sonra nihayet çivilemedim :) rezervasyon undefined oldu, ancak bu, rezervasyon nesnesini yolcunun yönlendiricisini kullanmadan önce, hizmet nesnesini nesneye gönderen yöntemi çağırarak düzeltdi. Teşekkürler. – Mandersen

+0

Servis sağlayıcısı için hizmet sağlayıcıya ulaşmıyorum, sağlayıcıları alt bileşen – user2180794