假设我在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 '
那样进行。之所以有意义,是因为它将为主题添加新属性,而不是替换现有属性。
在尊重不变性的同时,如何继续正确地更新主题?
谢谢
答案 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);
}
这不是最流畅的方法,但是至少您不必手动检查每个值!