【发布时间】:2020-04-18 04:33:30
【问题描述】:
我的 HTML 中有以下标记。它按预期工作并按预期执行。
<ng-container *ngIf="stuff$ | async as data">
<div *ngFor="let element of data">{{element.name}}</div>
</ng-container>
我开始篡改它,看看我可以阻止/改进什么,假设 as data 只为订阅的结果分配一个变量名(由于 async 管道),我希望我可以直接重用 data$,而无需处理额外的变量。所以我改成了这个。
<ng-container *ngIf="stuff$ | async">
<div *ngFor="let element of stuff$">{{element.name}}</div>
</ng-container>
这非常失败,产生了下面的错误。
错误错误:找不到类型为“object”的不同支持对象“[object Object]”。 NgFor 只支持绑定到 Arrays 等 Iterables。
虽然我理解错误的含义,但我不知道它来自哪里。我订阅的服务返回一个可观察的数组。被异步'ed 的属性的as'ing 是强制性的吗?我敢肯定,当我在异步管道上阅读时,我错过了一件微妙的小事,但我没有看到它。
stuff$: Observable<Thing[]>;
ngOnInit() { ...
this.stuff$ = this.stuffy.getStuff();
}
【问题讨论】:
-
你为什么认为会起作用?您实际上是用对其参数的引用替换了对函数返回值的引用,它们甚至可能不是同一类型。
-
@jonrsharpe 我无法为这种特殊情况提供动力。然而,在我 20 年的编程生涯中,我一直处于一种我不认为某些东西会起作用的情况,但它确实起作用了。无数次。以可以想象的最奇怪的方式(至少对我来说)。所以,虽然我实际上并不认为这一次会奏效,但统计数据告诉我,我可能又错了。有意义吗?
-
在一定程度上,但在没有理由认为它会起作用并且给出明确的反馈说它确实不起作用的情况下,我不清楚你为什么会留下一个问题。跨度>
-
@jonrsharpe 我知道你来自哪里。我想这纯粹是谦虚。 很可能产生错误消息的方法实际上是正确的但隐藏在另一个模糊的错误后面。这是一个很长的镜头,但如果你想象我不像其他人那么聪明,那么它不仅需要确定 它不起作用,而且还需要解释为什么它不起作用。我太无知了,无法做到这一点。相信我,如果我能够充分可靠地解释观察到的现象的复杂细节,我不会浪费我的时间(也不会浪费其他人的时间)。 :)
-
@jonrsharpe 我认为其中一个 cmets 刚刚证明了我的观点。我自己太笨了,无法自己弄清楚以下语法:let item of stuff$ |异步。但这是我试图实现的方法(省略中间 stuff 声明以从中选择 item 元素)。我为自己的口才不够道歉。
标签: angular typescript asynchronous pipe