【发布时间】:2018-09-16 18:19:02
【问题描述】:
经过一整天的努力寻找合适的解决方案,我终于来这里寻求帮助了。
我需要什么
在服务中,我必须提供一个返回对象数组的函数;第一次使用 HttpClient 从 Web 服务中检索这些对象时,我想将它们存储在本地变量中,以避免每次调用此服务函数时都消耗时间和流量。
最后,我必须在 <select *ngFor 标记中显示这些对象,并在设置值后设置默认值。
第一次尝试
service.ts
stati = null;
getStati() {
if (this.stati) return this.stati;
return this.http.get<ApiResponse>(this.apiUrl + 'lists/stati')
.pipe(
retry(3),
map(data => {
if (data.status === 0)
this.stati = data.response; // <-- this is an array
return this.stati;
}
));
}
request.component.ts
this.svcApi.getStati()
.subscribe((stati) => {
this.stati = stati;
this.request.nascita.stato = 'IT';
this.request.residenza.stato = 'IT';
});
request.component.html
<select class="form-control"
[(ngModel)]="request.nascita.stato" name="stato">
<option *ngFor="let stato of stati"
[value]="stato.codice">{{stato.nome | uppercase}}</option>
</select>
这仅第一次有效,但是当我的路由器(重新)激活路由时,我在组件中收到一个错误,指出svcApi.getStati().subscribe 不是函数;我自然明白这一点,因为这次我不返回 Observable 而是返回一个数组!
第二次尝试
于是我尝试更改服务功能:if (this.stati) return Observable.from(this.stati);
但是当我回到路线时,我在控制台中收到此错误:
错误错误:找不到不同的支持对象“[object Object]” '对象'类型。 NgFor 仅支持绑定到 Iterables,例如 数组。
第三次尝试
我最后一次尝试也是改变
<option *ngFor="let stato of stati | async"
但我收到此错误
错误类型错误:无法读取 null 的属性“处置” AsyncPipe.push
我很确定应该存在一个简单的解决方案,但作为一个新手我想不出来。
【问题讨论】:
-
代替
if (this.stati) return Observable.from(this.stati)试试:if (this.stati) return Observable.of(this.stati) -
@arturgrzesiak 你是我的救命稻草 :) 它有效,我觉得很愚蠢。太感谢了!请发表您的评论作为解决方案,我会接受!
-
你为什么要手动存储响应?您可以使用基本的可观察函数更轻松地做到这一点。 learnrxjs.io/operators/multicasting/sharereplay.html
-
@appl3r 请注意,
getStati每次调用时都会返回一个新流,并且该流以 promise 开头 - 在这种情况下,.shareReplay(1)和.toPromise()将非常等效。所以shareReplay如果不对服务做进一步的调整,也无济于事。
标签: angular typescript rxjs observable