2016-09-30 75 views
0

我有一個導航組件,我希望根據用戶是否登錄來顯示或隱藏。爲此,我添加了localStorage以確認用戶已登錄。但是,我的導航組件僅在OnInit期間收聽此內容。Angular 2獲取組件相互傾聽

如何讓一個組件聽取其他組件的變化?在這種情況下,導航會響應登錄組件的功能onlogin

navigation.component.ts

export class NavigationComponent implements OnInit { 
private navshow: boolean; 
if (localStorage.getItem('confirmo')){ this.navshow = true; } 
} 

signin.component.ts

export class SigninClass { 
onlogin(){ 
localStorage.setItem('confirmo', 'verdad'); } 
} 

回答

1

你可以跟蹤的東西onChanges或使用該事件的方法來「喊」出來已經發生的變化。

因此創建一個單身服務。有散發方法。在其他組件中提取服務並訂閱它。

服務

export class MessageInformation{ 
    constructor(public name: string, public details: string, public extra?: any[]){ 

    } 
} 

@Injectable() 
export class MessagingService { 
public parentFrameChangeEvent: EventEmitter<MessageInformation>; 

constructor(){ 
    this.parentFrameChangeEvent = new EventEmitter<MessageInformation>(); 
} 

public sendMessage(message: MessageInformation): void{ 
    this.parentFrameChangeEvent.emit(message); 
} 

}

然後注入到您的通話構造和使用,因此

var reloadMessage: MessageInformation = { name: "reload", details: "forcereload", extra: tabIdArray }; 
     this.messaging.sendMessage(reloadMessage); 

(注意你不需要的MessageInformation這只是一個我使用內部類來允許額外的信息通過)

再注入相同的單獨服務於任何目標組件和訂閱

this.messenger.parentFrameChangeEvent.subscribe(message => this.reloadData(message)); 

在該方法中,那麼你做的登錄事件的所有工作