Angular 4 Observable,NgFor 只支持绑定到 Iterables,比如数组

Posted

技术标签:

【中文标题】Angular 4 Observable,NgFor 只支持绑定到 Iterables,比如数组【英文标题】:Observable with Angular 4 , NgFor only supports binding to Iterables such as arrays 【发布时间】:2018-01-18 04:53:39 【问题描述】:

是的,我看到其他人收到此错误,我只是不太明白如何在我的代码中修复它

private _url = 'https://min-api.cryptocompare.com/data/pricemulti?fsyms=BTC,ETH,LTC,EOS,DASH&tsyms=USD'

如果我没有return,它不会因错误而崩溃,但我确实想返回数据。

我有一个调用此方法的组件(在此服务 ts 文件中)

订阅者:

getAllCoins() 

    var blah = [];

    return this.getCoins().subscribe(
        data => 
            blah = data;               
            //console.log('subscriber coins', blah)
        
    )


调用此代码

getCoins() 
    return this.http.get(this._url)
        .map((response: Response) => response.json())
        //.do(data => console.log(data))
        .do(data => console.log('All: ' + JSON.stringify(data)))  // do operator to peek 
        .catch(this.handleError);

现在,我看到来自 url 的数据看起来像这样


"BTC": 
  "USD": 3349.1
,
"ETH": 
  "USD": 296.3
,
"LTC": 
  "USD": 47.56
,
"EOS": 
  "USD": 1.83
,
"DASH": 
  "USD": 195.83


如何防止出现此错误errors.ts:42 ERROR Error: Uncaught (in promise): Error: Cannot find a differ supporting object '[object Object]' of type 'object'. NgFor only supports binding to Iterables such as Arrays.

更新评论问题

@Component(
template: `
<div>test</div>
<div *ngFor="let coin of coinsList">
 abc
 </div>
`
)

【问题讨论】:

它总是返回一个对象还是有可能返回一个数组? 你不需要数组,可以很容易地在一个对象上实现你自己的可迭代***.com/a/45321622/2545680 你能帮我看看吗,我不太明白 @JohnBaxter,您如何在模板中使用blah,您希望如何看到呈现的html?显示在您的问题中 @Maximus - 尝试在我更新的问题中使用它,显示模板的代码 thx 【参考方案1】:

正如错误所说,您正在尝试对 Object 执行 ngFor,它适用于任何可迭代对象。

也许您可以遍历它们并创建一个数组,然后将其用于 ngFor。

【讨论】:

它适用于任何可迭代对象,而不仅仅是数组***.com/a/45321622/2545680 等等,我该怎么做?似乎我对订阅者及其调用的方法做得很好,还是有更好的方法来编写该代码? 我看到有些人使用 Observable 甚至不使用订阅 - 我可以/应该更改我的代码,如何? getProducts(): Observable&lt;IProduct[]&gt; return this._http.get(this._productUrl) .map((response: Response) =&gt; &lt;IProduct[]&gt; response.json()) .do(data =&gt; console.log('All: ' + JSON.stringify(data))) .catch(this.handleError); 【参考方案2】:

正如其他人所说,*ngFor 仅适用于可迭代对象。

有几种方法可以解决这个问题。我现在想到的是:

1) 您可以将对象列表推送到数组。

this._ConfigurationService.getCoins()
            .subscribe(
            (data)=> 
                for(let key in data)
                  this.coinsList.push(data[key]);
                
            ,
            (error) => console.log("error : " + error)
        );

模板:

<div *ngFor="let coin of coinsList">
    <span>coin | json</span>
</div>

完整的 plunker 示例:http://plnkr.co/edit/zrzVF8qKl8EvKKp2Qt45?p=preview

2) 您可以使用管道将响应从对象转换为可迭代对象,如下所示:How to iterate [object object] using *ngFor in Angular 2

3) 您可以为您的对象实现可迭代函数,如下所示:Angular NgFor only supports binding to Iterables such as Arrays。

4) 您可以创建如下所示的特殊指令:Can ngForIn be used in angular 4?

为了简单起见,我的建议是使用第一个。

【讨论】:

由于某种原因,我收到一个错误 ERROR TypeError: Cannot read property 'push' of undefined 我正在做与订阅服务相同的事情 哦,唯一不同的是,如果我设置了coinsList:[],那么'any'类型的this.coinsList.push(data[key]) show error of Argument不能分配给'never'类型的参数`,所以我改为`硬币清单:任何;没有视觉错误 - 但我认为对数组有意义的推送错误......呃,你的 plunker 是怎么工作的 @JohnBaxter 你可能没有初始化coinsList。我已经在coinsList = []; 字段中初始化了它,你只是用coinsList:[]; 声明它的类型。即:=不是同一个操作。找出两张图片之间的差异:-) 是的 - 很酷 - 我喜欢打字稿,只是不想再考虑 javascript ha thx @JohnBaxter 没问题 :-)

以上是关于Angular 4 Observable,NgFor 只支持绑定到 Iterables,比如数组的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Angular 4 中推送到数组的 Observable? RxJS

Angular 4:如何正确处理应用程序级别的 http 错误作为 Observable 错误?

Angular 4 Observable,NgFor 只支持绑定到 Iterables,比如数组

如何使用 Rxjs Observable 和 Async Pipe 在 Angular 4 中为每日重复事件创建倒数计时器

Angular rxjs Observable.timer 不是具有导入功能的函数

Angular 5 - Promise vs Observable - 性能上下文