在Angular 2 rc.5
在AppComponent
提供服務,因此將作爲無處不在一個單:
// https://angular.io/docs/ts/latest/guide/ngmodule.html#!#ngmodule-properties
@NgModule({
imports: [...],
declarations: [...],
providers: [UserService],
bootstrap: [AppComponent]
})
export default class AppModule {}
在需要訪問該服務的組成部分,注入它,然後使用它
import {UserService} from '...';
...
//inject service into the constructor
constructor(private userSvc:UserService){}
...
//to login
this.userSvc.login();
你也可以訪問該服務在該組件的模板
<div *ngIf="userSvc.isLoggedIn">Protected data </div>
附錄:
如果你想在用戶註銷一切自動更新,而不是指一個布爾userSvc.isLoggedIn
,指的是目的。
UserService
state = {
loggedIn:false,
... //other states of the user (eg: permissions, preferences)
};
logout(){ this.state.loggedIn = false }
login() { this.state.loggedIn = true }
然後在你的組件模板
<div *ngIf="userSvc.state.loggedIn"> Protected data </div>
這工作,因爲所有引用到相同state
對象在內存中,而在原來的實現,你複製的值爲isLoggedIn
。請記住:爲了在應用範圍內使用此功能,請僅提供AppModule
的服務。請勿將其包含在任何其他模塊或組件的providers
陣列中。
嗨陰間大法師將其綁定,userSrv.IsLoggedIn沒有得到當有人點擊註銷時更新。我會用Günter建議的Observables來嘗試它。謝謝你的回答! –
@Mike當然你可以做到這一點。一個更簡單的解決方案利用了以下事實:(1)當值本身改變(使用它的內部可觀察對象)和(2)對象在JavaScript中通過引用傳遞時,Angular更新應用程序。看看我添加到我的答案。 – BeetleJuice
@Mike你還需要確保你在我的答案中不要跳過第1步。該服務只能由'AppModule'提供。不要將它包含在任何其他模塊的「提供者」數組中。否則,您將並行運行不同的服務實例,並使用不同的狀態。 – BeetleJuice