在方法中用next()更新RXJS主题,如何处理参数?

时间:2019-01-29 15:35:44

标签: angular ecmascript-6 rxjs

假设我在Angular中有一项服务,其中有一个主题。我实现了一个updateSubject方法,该方法将在此主题上使用.next()。想法是在其他组件中使用此服务的方法。

interface MyInterface {
 name: string;
 age: number;
}

export class myService {
  private mySubject: BehaviorSubject<MyInterface >;

  updateSubject(newData) {
    this.mySubject.next({...this.mySubject.value, newData);
  }
 }
export class myComponent {

  constructor(private myService: myService){}

  update() {
    this.myService.updateSubject({age:30});
  }
}

问题是,我无法像tslint告诉我Argument of type {newData: any, name: string, age: number} is not assignable to parameter of type 'MyInterface '那样进行。之所以有意义,是因为它将为主题添加新属性,而不是替换现有属性。

在尊重不变性的同时,如何继续正确地更新主题?

谢谢

1 个答案:

答案 0 :(得分:0)

我想我理解您要完成的工作,但是对于初学者来说,next()接受一个参数并为Subject分配该值。进行部分加法(例如添加 just 年龄)的一种方法是获取当前值,将其与新值合并,然后将该值传递给。

const holderData: MyInterface = {
    name: 'fred',
    age: 40
}

merge(defaultData, newData): MyInterface {
    for (const key in newData) {
        if (newData.hasOwnProperty(key)) { defaultData[key] = newData[key]; }
    }
    return defaultData;
}

updateSubject(newData: MyInterface){
    const mergedData = this.merge(this.holderData, newData);
    this.mySubject.next(mergedData);
}

这不是最流畅的方法,但是至少您不必手动检查每个值!