BehaviorSubject/Subject 发出基元值和非基元引用 - POC 结果

BehaviorSubject/Subject Emits Values for Primitive and References for Non-Primitive - POC Results

提问人:Sangram Patil 提问时间:11/16/2023 更新时间:11/16/2023 访问量:20

问:

有人可以在下面说明一下,因为它不是互联网上广泛讨论的话题。如果有人通过进一步的分析来证实这一点,将会有所帮助。

我想知道 Subject 和 BS 只发出订阅中非原始数据类型的引用。因此,如果多个组件使用发出的对象,则这些组件仅访问在组件之间共享的单个副本。

这些是我的 POC 的观察结果:https://stackblitz.com/edit/angular-12-starter-project-daidh-4x2jth?file=src%2Fapp%2Fstudent.service.ts

为了快速浏览,请共享下面的代码屏幕截图:

student.service.ts:

  studentSubject = new Subject<any>();
  counterSubject = new Subject<any>();
  emitValues() {
    //get student obj from db here
    let student = { rollNo: 1, name: 'student1', age: 20 };
    this.studentSubject.next(student);

    let counter = 1;
    this.counterSubject.next(counter);
  }

以上 2 个主题在 3 个组件中订阅,发出的值与文本框值绑定。

对于 Student 对象(非基元):从任何组件到发出值的更改将反映在其他组件中,尽管该对象实际上不是通过服务共享的对象。

对于计数器值(基元):从任何组件到发出值的变化,不会反映到其他组件。

student1.component.ts:

  student: any = {};
  counter: any;
  ngOnInit() {
    this._studentService.studentSubject.subscribe((stud) => {
      this.student = stud;
      console.log(stud);
    });
    this._studentService.counterSubject.subscribe((counter) => {
      this.counter = counter;
    });
  }

student2.component.ts:

  student: any = {};
  counter: any;
  ngOnInit() {
    this._studentService.studentSubject.subscribe((stud) => {
      this.student = stud;
      console.log(stud);
    });
    this._studentService.counterSubject.subscribe((counter) => {
      this.counter = counter;
    });
  }
JavaScript Angular 打字稿

评论

2赞 enno.void 11/16/2023
这与 rxjs 无关。在 JavaScript 中,对象总是通过复制引用传递

答: 暂无答案