Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 在service.subscribe中组件构造函数中的角度更新无效_Angular_Angular Components_Angular5 - Fatal编程技术网

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);