如果我有一个可观察的学生:Observable< Student>其中Student具有参数名称:string设置为Jim,如何在可观察到的学生中将name的值更改为Bob?
编辑:
应该使用student.map(student => student.name =’Bob’).因为如果是,那么我的程序还有其他问题.
解决方法:
@ZahiC的答案是正确的,但让我解释一下原因.
首先,使用Rxjs,副作用越少越好.
不变是你的朋友!否则,当您的应用程序增长时,尝试猜测对象已在何处变异将是一场噩梦.
其次,由于Typescript 2.1,您可以使用对象传播.这意味着要更新一个学生对象,而不是这样做:
const newStudent = Object.assign({}, oldStudent, {name: 'new student name'});
你可以做:
const newStudent = {...oldStudent, name: 'new student name'};
在这两种情况下,您都不会突变原始学生,而是创建具有更新值的新学生.
最后一件事是如何将其与Rxjs结合使用.
地图运算符的作用是:取一个值,用它来做您想做的,然后返回一个将在可观察链中使用的新值.
因此,代替:
student.map(student => student.name = 'Bob');
您应该这样做(就像@ZahiC指出的那样):
student.map(student => ({...student, name: 'Bob'}));
并且为了避免遮盖变量名,您可能还需要调用可观察对象:student $
student$.map(student => ({...student, name: 'Bob'}));
编辑:
从Rxjs 5.5开始,您不应使用在Observable.prototype上打补丁的运算符,而应使用管道运算符:
student$.pipe(
map(student => ({...student, name: 'Bob'})),
tap(student => console.log(student)) // will display the new student
)