2017-09-28 20 views
0

私は2つの兄弟コンポーネント、1つのMapComponentと1つのMenuComponentを持っています。すべてのプロジェクトはGoogleMap(MapComponent)に表示されます。マーカーをクリックすると、そのプロジェクトのID(siteId)が取得されます。私がしたいのは、そのプロジェクトidを取得してそれを私のメニューのリンクに使用することです。プロジェクトごとに、プロジェクトIDと一意のリンクを作ります:/ project1/10001 私は兄弟から共有サービスを持っていますコンポーネントは値を直接交換できません。私は共有サービスにプロジェクトIDを書くことができますが、私の問題は私のmenulinksでプロジェクトIDを取得することです。これはどうすればいいですか? (私はAngular4を使用しています)Angular4の2つの兄弟コンポーネント間の共有サービス

MapComponent

clickedMarker(siteId: string) { 
    this.ss.selectedSite(siteId); 
    this.route.navigate(['project', siteId]); 
    } 

MenuComponentは

selectedSite = this.sharedService.siteId; 

<a class="submenu" *ngFor="let submenu of item.submenu, let i = index" 
    md-list-item [routerLink]="[submenu.url, selectedSite]"> 
    <i class="material-icons spacer">{{submenu.icon}}</i> 
    <div *ngIf="!minimalMenuOpen">{{submenu.name}}</div> 
</a> 

SharedService

@Injectable() 
export class SharedService { 

    public constructor() { 
    console.log('Service is succesfully initialized'); 
    } 

    siteId; 
    selectedSite(siteId) { 
    this.siteId = siteId; 
    console.log(siteId); 
    } 

} 

答えて

0

は、ここで私はあなたの状況にどうなるのかです。あなたがその

activePage: number; 
 

 
constructor(private path: ActivatedRoute) {} 
 

 
    ngOnInit() { 
 
    this.path.queryParams.subscribe(path => { 
 
     // If there is a value 
 
     this.activePage = +path["id"]; 
 
     if (isUndefined(this.activePage)) { 
 
     // What if there is no value 
 
     } 
 
    });

に向けて、あなたのコンポーネントの設定のほとんどを持っているようAngular 2 send array another page

は、私はあなたがこのようなリンクを生成することはできませんサービスのアプローチをお勧めしますか?

> MenuComponent TS file 
 

 
selectedSite; 
 
this.sharedService.getSelectedSiteId().subscribe(
 
    (siteId: any) => { 
 
    this.selectedSite = siteId; 
 
    });
> MenuComponent HTML file 
 

 
<!-- This make sure links don't start creating till selectedSite available --> 
 
<ng-container *ngIf="!selectedSite"> 
 
    <a class="submenu" *ngFor="let submenu of item.submenu, let i = index" md-list-item [routerLink]="[submenu.url]" [queryParams]="{id:'"+ selectedSite + "'}"> 
 
    <i class="material-icons spacer">{{submenu.icon}}</i> 
 
    <div *ngIf="!minimalMenuOpen">{{submenu.name}}</div> 
 
    </a> 
 
</ng-container>

あなたのサービスのために、この微調整のビットを必要とします。

@Injectable() 
 
export class SharedService { 
 

 
    public constructor() { 
 
    console.log('Service is succesfully initialized'); 
 
    } 
 

 
    private siteId: BehaviorSubject<any> = new BehaviorSubject(null); 
 

 
    selectedSite(siteId) { 
 
    this.siteId.next(siteId); 
 
    console.log(siteId); 
 
    } 
 
    
 
    getSelectedSiteId(): Observable<any> { 
 
    return this.siteId.asObservable(); 
 
    } 
 

 
}

+0

BehaviorSubjectと観測の違いは何ですか?私は両方が他の人によって頻繁に使用されるのを見るからです。 – viddrawings

+0

BehaviourSubjectは、コンポーネントが存続しているか、または値が変更されている限り、最後の値を保持します。 Observableは、非同期データを管理するために使用される非同期メソッドです。 Observable(I.E.変数)を参照している値に値が変更された場合、変更を '.subscribe()'メソッドに送信してそのデータを使用します。なぜなら、 'Promise'は一度だけ実行され、' Observable'は複数回実行されるからです。 –

+0

このソリューションはうまくいきますが、routerLinkは既にインスタンス化されていますので、私はrouterLink(これは現在動作していません)を更新する必要があります。 – viddrawings

関連する問題