Angular 在service.subscribe中组件构造函数中的角度更新无效
我有两个组件,父组件和子组件,并使用共享服务在它们之间发送数据 服务类如下所示:Angular 在service.subscribe中组件构造函数中的角度更新无效,angular,angular-components,angular5,Angular,Angular Components,Angular5,我有两个组件,父组件和子组件,并使用共享服务在它们之间发送数据 服务类如下所示: export class AddItemDataTransferService { // Observable string sources private childData= new Subject<string>(); private parentData= new Subject<string>(); // Observable string streams
export class AddItemDataTransferService {
// Observable string sources
private childData= new Subject<string>();
private parentData= new Subject<string>();
// Observable string streams
childdata$ = this.childData.asObservable();
parentdata$ = this.parentData.asObservable();
// Service message commands
addChildData(ch: string) {
this.childData.next(ch);
}
addParentData(ch: string) {
this.parentData.next(ch);
}
}
获取数据在这里非常有效。在浏览器中调用警报,弹出窗口显示ch字符串。因此,这意味着数据是从服务导入的,但this.newString不会更新
当我从子组件导入父视图中的数据时,同样的情况也适用。但是当我想在子组件中执行同样的操作时,尝试将代码移动到ngOnInit时失败。请注意在构造函数中使用的逻辑,因为它可能依赖于尚未可用的逻辑。数据在构造函数中并不总是立即可用的,因此它只需将初始局部变量设置为简单值即可。ngOnInit是组件获取初始数据的好地方 在类AddItemDataTransferService中,您应该将主题更改为行为主题。我假设在您添加ParentData或addChildData之后,您的子组件订阅了服务上公开的可观察对象 由于您正在使用主题,因此在向主题添加数据后,这些主题将仅向当前订阅者广播。任何后续订户都不会获得以前广播的数据 通过使用BehaviorSubject,任何后续订阅者都将获得先前广播的数据
export class AddItemDataTransferService {
// BehaviorSubjects must have a starting value.
private childData= new BehaviorSubject<string>(null);
private parentData= new BehaviorSubject<string>(null);
你用控制台试过了吗;而不是警觉?我还认为最好是在ngOnInit中订阅,而不是使用构造函数。有什么区别?为什么它很重要?结果相同,ch已登录控制台,但对象未更新。我已将方法移动到ngOnInit,但未更改任何内容。警报使用字符串数据,但是newString没有更新:虽然它在从子对象到父对象获取数据并更新它时工作正常,但要检查的另一件事是确保您的getDataService仅包含在app.module中的提供程序中,而不是包含在多个组件的提供程序中;否则它将有多个服务实例,这可能会打乱订阅。是的,很好的观点。从主题更改为行为主题非常有效,非常感谢
export class AddItemDataTransferService {
// BehaviorSubjects must have a starting value.
private childData= new BehaviorSubject<string>(null);
private parentData= new BehaviorSubject<string>(null);