【发布时间】:2021-11-06 08:30:49
【问题描述】:
所以我进行了实时搜索,根据用户输入获取数据。
例子:
export class MyComponent implements OnInit {
constructor(private httpHandler: HttpHandlerService) { }
defaultSearchParams: SearchParams = { search: 'bla' }
searchParams = new BehaviorSubject<SearchParams>(this.defaultSearchParams);
myData$?: Observable<PageObjects<MyDataObject>>;
ngOnInit(): void {
this.myData$ = this.searchParams.pipe(
debounceTime(300),
switchMap((searchParams: SearchParams) => this.fetchMyData(searchParams)),
);
}
fetchMyData(searchParams: SearchParams): Observable<MyDataObject> {
return this.httpHandler.getMyData(searchParams);
}
}
我的模板显示数据:
<div *ngIf="(myData$ | async) as resultset$">
<div *ngIf="resultset$.elements && resultset$.elements.length">
<div *ngFor="let dataObject of resultset$.elements">
ID: {{dataObject.id}}, name {{dataObject.name}}, status {{dataObject.status}}
</div>
</div>
</div>
好的,挑战来了: 在我的模板中,我希望能够更改数据(即新名称、新状态)。
在使用像我这样的可观察对象时,如何在模板中反映这些更改的数据?
期望结果的示例:
<div *ngIf="(myData$ | async) as resultset$">
<div *ngIf="resultset$.elements && resultset$.elements.length">
<div *ngFor="let dataObject of resultset$.elements">
ID: {{dataObject.id}}, name {{dataObject.name}}, status {{dataObject.status}}
<button (click)="changeStatus(dataObject)" type="button">Change status</button>
</div>
</div>
</div>
changeStatus(MyDataObject dataObject) {
this.httpHandler.changeStatusOfObject(dataObject, 'newStatus')
.subscribe(newDataObject => //WHERE should I put the newDataObject to, to show the new value in the template???);
}
【问题讨论】:
-
什么是
myData$.elements? -
elements 是保存实际数据对象集的对象数组
-
但是
myData$是可观察的,这里不能直接访问elements。你应该改用resultset$.elements。 -
啊,对不起,我搞砸了变量名,我会在一秒钟内解决这个问题
-
在这种情况下,您将获取结果冷存储在外部状态中,例如 BehaviourSubject。每当服务器返回更改时,您就会改变 BehaviourSubject 拥有的内容和
next的结果。myData$将是该 BehaviourSubject 的 Observable
标签: angular typescript rxjs angular12