经过一整天的努力寻找合适的解决方案后,我终于在这里寻求帮助。
我需要什么
在服务中,我必须提供一个返回对象数组的函数。第一次使用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);
但是当我回到路由时,在控制台中出现此错误:
错误错误:找不到其他支持对象'[对象对象]' 类型为“对象”。 NgFor仅支持绑定到Iterables,例如 数组。
第三次尝试
我最后的尝试是也要更改
<option *ngFor="let stato of stati | async"
但是我得到这个错误
错误TypeError:无法读取null的属性“ dispose” AsyncPipe.push
我很确定应该有一个简单的解决方案,但是作为一个新手,我想不到。
答案 0 :(得分:3)
如评论中所述:
而不是if(this.stati)返回Observable.from(this.stati),请尝试:if(this.stati)返回Observable.of(this.stati)
感觉不到实际答案,因此会提供更多上下文:
of(x)
等效于from([x])
。
of
基本上包装了传递给任何对象的内容,而没有进行任何修改-of(of)
是虚拟的,但完全可以。另一方面,from
假定该值的类型为ObservableInput<T> = SubscribableOrPromise<T> | ArrayLike<T> | Iterable<T>;
,并将尝试将原始包装器转换为可观察的包装器。例如。 from(42)
是不正确的,但是from('42')
是-后者发出4
,2
和completes
。 string
的确是ArrayLike
,如果有人认为from
的行为像of
,这可能会造成混乱。 from
似乎有点超载-我个人从不使用SubscribableOrPromise<T>
。
直观上from
可以容易地解释为等同于of
。恕我直言,应该有一个像fromArray
这样的函数-尤其是因为fromPromise
几乎没有用,因为它不是惰性的。在我的用法中,无论如何总是将数组传递给from
。
一些其他反馈
在干净状态下,如果getStati
被多次调用,则将有多个请求发送到服务器,并且缓存永不过期。