Обновите тему RXJS с помощью next () в методе, как работать с параметрами? - PullRequest
0 голосов
/ 29 января 2019

Допустим, у меня есть служба, в 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 голосов
/ 29 января 2019

Мне кажется, я понимаю, чего вы пытаетесь достичь, но для начала next() принимает один параметр и присваивает субъекту это значение.Один из способов сделать частичное добавление (например, добавить просто age) - взять текущее значение, объединить его с новым значением и передать это значение в.

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);
}

Не самый элегантный метод, но, по крайней мере, вам не нужно вручную просматривать каждое значение!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...