angular - Angular 7:无法从组件之间共享的服务中获取价值
问题描述
我有一个带有 setter 和 getter 的服务类
@Injectable()
export class DataService {
name: string;
getName(): string {
return this.name
}
setName(newname: string) {
this.name = newname;
}
}
我也在 app.module 中定义了这个
providers: [ DataService ]
并在一个组件中设置名称并尝试从另一个组件中检索。我不确定。
解决方案
您的组件可能getName
在任何有机会调用setName
. 你可能在ngOnInit
. 我建议你试试这个 Subject-Observable 模式(不要忘记从 rxjs 导入你需要的任何东西):
服务.ts
name: string; // not always necessary/desired
nameSub: BehaviorSubject<string> = new BehaviorSubject(''); // initializing with empty string--could be anything you want
getName: Observable<string> = this.nameSub.asObservable();
setName (name: string) {
this.name = name; // not always necessary/desired
this.nameSub.next(name);
}
任何组件.ts
myName: string;
sub: Subscription;
ngOnInit () {
this.sub = dataService.getName.subscribe(name => {
// assign name to local variable or class property, for example:
this.myName = name;
});
}
inputHandler (event) {
// calling this method will automatically update `myName` through the subscription in ngOnInit!
dataService.setName(event.name);
}
// Don't forget to unsubscribe when you create your own subscriptions
ngOnDestroy () {
this.sub.unsubscribe();
}
这种模式允许您将状态保存在一个地方(服务),但也可以通过利用 RxJs Observables 在任何地方发生任何变化时得到通知。
您可以在此处阅读有关 BehaviorSubjects 和其他内容的信息:http ://reactivex.io/rxjs/manual/overview.html#behaviorsubject
推荐阅读
- javascript - 服务器运行期间没有视觉显示
- javascript - 使用 onDisconnect() 拒绝 Firestore/Firebase 权限
- swift - 每次构建之前都需要重新安装库(迦太基)
- javascript - 如何更新变量而不更新其在 JavaScript 中的前等值
- c# - 用 WHERE 条件查询子表的问题
- html - 带有 ng-select 的下拉面板中的透明背景错误
- c# - NSwag 中的条件运算处理器
- dialogflow-es - 我可以使用外部事件在 Dialogflow 中开始聊天机器人对话吗?
- android - Android TV Leanback 加载图标图像以减少内存占用的最佳位置
- javascript - 制表符将行拖到 div