angular - 使用主题和代理传递数据

标签 angular rxjs

是否可以在服务中使用主题进行双向数据流?例如,假设我希望某个组件检索信息,然后通过服务主题发布它以供其他组件使用。

消费组件然后对该信息进行一些更改,然后重新发布它,以便原始组件可以检索更改。

这可以使用观察者模式吗?

另外,如果我想观察这些数据的变化(假设数据是通过数组传入的),我是否必须使用 proxy完成这个?

最佳答案

在组件之间传递数据时,我发现 RxJS BehaviorSubject 非常有用。

您也可以使用常规 RxJS Subject 通过服务共享数据,但这就是我更喜欢 BehaviorSubject 的原因。

  1. 它将始终返回订阅时的当前值 - 无需调用 onNext()。
  2. 它有一个 getValue() 函数来提取最后一个值作为原始数据。
  3. 确保组件始终接收最新数据。
  4. 您可以使用 asObservable() 从行为主体中获取 observable 行为主体的方法。
  5. Refer this for more

示例

在服务中,我们将创建一个私有(private)的 BehaviorSubject 来保存消息的当前值。我们定义了一个 currentMessage 变量来将这个数据流作为一个可观察的对象来处理,其他组件将使用它。最后,我们创建调用 BehaviorSubject 上的 next 的函数来更改其值。

父组件、子组件和兄弟组件都接受相同的处理。我们在组件中注入(inject) DataService,然后订阅 currentMessage observable 并将其值设置为等于 message 变量。

现在,如果我们在其中任何一个组件中创建一个函数来更改消息的值。更新后的值会自动广播到所有其他组件。

shared.service.ts

import { Injectable } from '@angular/core';
import { BehaviorSubject } from 'rxjs';

@Injectable()
export class SharedService {

  private messageSource = new BehaviorSubject<string>("default message");
  currentMessage = this.messageSource.asObservable();

  constructor() { }

  changeMessage(message: string) {
    this.messageSource.next(message)
  }

}

parent.component.ts

import { Component, OnInit } from '@angular/core';
import { DataService } from "../data.service";

@Component({
  selector: 'app-parent',
  template: `
     {{message}}
   `,
   styleUrls: ['./parent.component.css']
})
export class ParentComponent implements OnInit {

  message: string;

  constructor(private data: DataService) { }

  ngOnInit() {
    this.data.currentMessage.subscribe(message => this.message = message)
  }
}

sibling.component.ts

import { Component, OnInit } from '@angular/core';
import { SharedService } from "../shared.service";

@Component({
  selector: 'app-sibling',
  template: `
    {{message}}
    <button (click)="newMessage()">New Message</button>
  `,
  styleUrls: ['./sibling.component.css']
})
export class SiblingComponent implements OnInit {

  message: string;

  constructor(private service: SharedService) { }

  ngOnInit() {
  }

  newMessage() {
    this.service.changeMessage("Hello from Sibling");
  }

}

关于angular - 使用主题和代理传递数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49387889/

相关文章:

angular - 使用 Material Design 的表格中的单选按钮

angular - Angular 2 中的简单 ngFor 错误

Angular 密码强度扩展颜色不起作用

RXJS Observable - 如何从 Observable 的构造函数外部调用 next

javascript - rxjs Observable 相对于 DOM 事件有什么优点?

html - 在 select 标签中使用 [ngValue] 和 [selected]

angular - TS2307 内部版本 :Cannot find module 'lodash'

javascript - 使用 forkJoin 的条件可观察对象

angular - rxjs中sample和throttle的区别

javascript - RxJS 将新项目添加到数组流未发布给订阅者