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