【问题标题】:Angular subscription fires only onceAngular 订阅只触发一次
【发布时间】:2019-09-22 09:06:26
【问题描述】:

尝试在点击侦听器上使用 Behavior Subject 进行订阅,并在首次加载订阅的组件时从服务中获取空对象;

ngOnInit() {
    this.shareDataService.dataUpdate$.subscribe(success =>{
      this.data = success;
    })
  }

我尝试过使用 observable 和 async 管道,结果是一样的。服务是providedIn: 'root'。如果订阅在ngOnChanges(changes: SimpleChanges) {} 生命周期钩子订阅在每次点击时触发,但总是有空对象。

我试图在stackblitz 上重现它,一切正常。对象从object-sender 组件发送到服务;

this.shareDataService.dataVisibility(this.data);

receiver 组件中接收到对象,这是预期的行为,所以我不知道为什么应用程序中有空对象。

可能是什么问题?

【问题讨论】:

  • 我没有完全理解这个问题,你能详细说明一下吗?你想做什么?预期的结果是什么?数据来自哪里?
  • 尝试使用从组件一发送到服务的数据获取对象,并尝试使用订阅从服务获取组件二中的这些对象。在组件二中总是得到空对象,尽管在服务对象不是空的。
  • 你能展示你实现主题的代码吗?
  • @Talg123 请查看 [subject.service] (stackblitz.com/edit/angular-kg4mg3)。有一个行为主体的实现,并且在服务(dataInfo)对象中记录在控制台中。

标签: angular rxjs observable angular-services behaviorsubject


【解决方案1】:

这是预期的行为。

您正在 ngOnInit 生命周期中从 object-sender 组件发送数据`

export class ObjectSenderComponent implements OnInit {

    constructor(private shareDataService: ShareDataService) { }

    data: Object = {};

    ngOnInit() {
        this.shareDataService.dataVisibility(this.data);
    }

    onClick = () => {

        this.data = {
            dataName: "Data",
            dataVisible: true
        }

        this.shareDataService.dataVisibility(this.data);
    }
}

使用异步管道将组件添加/删除到dom`

 <app-receiver 
     *ngIf="shareDataService.isBtnClicked$ | async"
 ></app-receiver>

这意味着每次点击这个按钮时它都会被销毁和初始化`

 <button (click)="onClick()"> Get Object </button>

并且每次 ngOnInit 生命周期钩子都会被调用。所以每次你从 dom 中移除 object-sender 组件并读取它时,它都会发送这个数据;

data: Object = {};

【讨论】:

    猜你喜欢
    • 2020-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-24
    • 1970-01-01
    • 2019-11-15
    • 1970-01-01
    相关资源
    最近更新 更多