Angular2 如何在全球范围内观看服务 属性?
Angular2 how to watch a service property globally?
我已经使用 Angular2 玩了几天,到目前为止我真的很喜欢它。但我似乎无法理解某些事情。
我有一个 class userService,它有 2 个函数(我删除了大部分逻辑。)改变了 IsLoggedIn 属性:
@Injectable()
export class UserService{
public IsLoggedIn:bool = false
login(){
this.IsLoggedIn = true;
}
logout(){
this.IsLoggedIn = false;
}
}
我想根据 IsLoggedIn 属性 在我的全局视图中显示和隐藏一些元素。执行此操作的最佳方法是什么?
在Angular 2 rc.5
1 在您的 AppComponent
中提供服务,这样它就可以在任何地方作为单例使用:
// https://angular.io/docs/ts/latest/guide/ngmodule.html#!#ngmodule-properties
@NgModule({
imports: [...],
declarations: [...],
providers: [UserService],
bootstrap: [AppComponent]
})
export default class AppModule {}
2在需要访问服务的组件中注入,然后使用
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
,请引用对象。
用户服务
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
对象,而在您的原始实现中,您 copied isLoggedIn
的值。请记住:要使其在整个应用程序范围内运行,请仅提供来自 AppModule
的服务。不要将它包含在任何其他模块或组件的 providers
数组中。
根据 isLoggedIn
属性
将服务注入您想要 show/hide 内容的组件
constructor(this.userService:UserService)
<div *ngIf="userService.IsLoggedIn">
content when logged in
</div>
<div *ngIf="!userService.IsLoggedIn">
content when not logged in
</div>
更好的是可观察值而不是布尔值。 Observables 在变化检测方面更有效,因为它们主动通知变化。
有关详细信息,请参阅 https://angular.io/docs/ts/latest/cookbook/component-communication.html#!#bidirectional-service
你只需将 UserService 注入每个组件
constructor(public userService:UserService) {
}
你想在哪里使用它并通过
绑定它
<div *ngIf="userService.IsLoggedIn">hello world</div>
我已经使用 Angular2 玩了几天,到目前为止我真的很喜欢它。但我似乎无法理解某些事情。
我有一个 class userService,它有 2 个函数(我删除了大部分逻辑。)改变了 IsLoggedIn 属性:
@Injectable()
export class UserService{
public IsLoggedIn:bool = false
login(){
this.IsLoggedIn = true;
}
logout(){
this.IsLoggedIn = false;
}
}
我想根据 IsLoggedIn 属性 在我的全局视图中显示和隐藏一些元素。执行此操作的最佳方法是什么?
在Angular 2 rc.5
1 在您的 AppComponent
中提供服务,这样它就可以在任何地方作为单例使用:
// https://angular.io/docs/ts/latest/guide/ngmodule.html#!#ngmodule-properties
@NgModule({
imports: [...],
declarations: [...],
providers: [UserService],
bootstrap: [AppComponent]
})
export default class AppModule {}
2在需要访问服务的组件中注入,然后使用
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
,请引用对象。
用户服务
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
对象,而在您的原始实现中,您 copied isLoggedIn
的值。请记住:要使其在整个应用程序范围内运行,请仅提供来自 AppModule
的服务。不要将它包含在任何其他模块或组件的 providers
数组中。
根据 isLoggedIn
属性
constructor(this.userService:UserService)
<div *ngIf="userService.IsLoggedIn">
content when logged in
</div>
<div *ngIf="!userService.IsLoggedIn">
content when not logged in
</div>
更好的是可观察值而不是布尔值。 Observables 在变化检测方面更有效,因为它们主动通知变化。 有关详细信息,请参阅 https://angular.io/docs/ts/latest/cookbook/component-communication.html#!#bidirectional-service
你只需将 UserService 注入每个组件
constructor(public userService:UserService) {
}
你想在哪里使用它并通过
绑定它<div *ngIf="userService.IsLoggedIn">hello world</div>