【问题标题】:How to Change the property of an Observable Object. Angular 2/BehaviorSubject如何更改 Observable 对象的属性。 Angular 2/行为主题
【发布时间】:2018-03-03 12:58:45
【问题描述】:

我有一个 Person 类型的对象,其中包含 firstName、lastName、age 字段。我使用行为主题检测任何变化。我有一个观察组件,它订阅了此 Person 对象上的每个更改。一旦检测到变化,观察组件就会调用一个方法。我想让这个方法改变 Observable Person 对象的属性。

为我服务

export class PersonService {

    personToCopySource = new BehaviorSubject<Person>(null);
    personToCopy = this.personToCopySource.asObservable();

在我的组件中

 export class ObservingComponent {

    constructor(public person: Person) {}

    ngOnInit(){
      this.personService.person.subscribe(
         data=> {
           this.updateMethod()
          }
      )
    }

   updateMethod(){
     this.personService.firstName = 'updated First Name';
   }

当我更改 Observing 对象的属性时,我得到了这个错误。 Observable 类型上不存在“属性”firstName

【问题讨论】:

  • 一个 observable 是一个流。它没有属性。你想让我做什么?你想把你自己的价值放在流上吗?在这种情况下,您可以尝试Subject#next
  • 最初我在服务中有一个 Person 类型的变量 person。我想要的是检测这个对象属性的任何变化。还有其他方法可以检测服务中声明的变量的变化吗?

标签: angular rxjs


【解决方案1】:

observable 是一个流。它没有属性。你想让我做什么?你想把你自己的价值放在流上,更新firstName吗?在这种情况下,你可以试试Subject#next

export class PersonService {

  personToCopySource = new BehaviorSubject<Person>(null);
  personToCopy = this.personToCopySource.asObservable();

  // Provide a method to update a person,
  // by putting a new or updated person on the stream.
  update(person: Person) { 
    this.personToCopySource.next(person); 
  }

在我的组件中

export class ObservingComponent {

    constructor(public person: Person) {}

    ngOnInit(){
        this.personService.personToCopy.subscribe(
            data=> {
                this.updateMethod(data)
            })
    }

    updateMethod(data){
        this.personService.update({...data, firstName: 'updated First Name'});
    }

【讨论】:

  • 我对服务内的更新方法有疑问。更新人员会创建一个新的人员对象并替换以前的人员还是同一人员对象并仅更新 firtsName 属性?
  • @ilovejavaAJ 你需要了解流的概念。流是一系列事物。他们只是来了,一个接一个。你不改变它们。您可以使用subscribe 从流中读取内容,或者可以使用next() 在流中添加新内容。在流上放置一个新项目并不是“替换”任何东西:它只是在流上放置一个新项目。流中的新项目可能是前一个项目的修改版本,但这并不意味着它“更新”了前一个项目,前一个项目可能已经以其原始状态进行了处理。
  • @ilovejavaAJ,如何将“this.personService”对象更新为空?就我而言,单击按钮后,我需要重置值。你有什么想法吗?
猜你喜欢
  • 1970-01-01
  • 2016-09-24
  • 1970-01-01
  • 2016-12-27
  • 2021-01-27
  • 1970-01-01
  • 1970-01-01
  • 2019-03-09
  • 2014-11-01
相关资源
最近更新 更多