【问题标题】:Angular 6 Error trying to diff '[object Object]'. Only arrays and iterables are allowed尝试区分“[object Object]”的 Angular 6 错误。只允许使用数组和可迭代对象
【发布时间】:2018-12-25 15:00:47
【问题描述】:

我认为我的问题是 API 提供的是对象而不是数组。所以我需要将对象修改为数组?

如何做到这一点? 对象分配? 还是管道? 有人有合适的例子吗? 我还在学习 Angular 这是我的第二个项目,所以我需要一些帮助;)

到目前为止!

这是我的代码

从 API 获取数据 ..不能更改它提供对象的 API

知识库服务

    import {Injectable, OnInit} from '@angular/core';
    import { HttpClient, HttpErrorResponse, HttpHeaders, HttpRequest, HttpResponse} from '@angular/common/http';
    import {environment} from '../../environments/environment';
    import { WikiModel } from '../../models/wikiItems.model'
    import {catchError, map, take} from 'rxjs/operators';
    import {throwError} from 'rxjs';


    @Injectable()
    export class KnowledgeBaseService {
      wikiApiUrl: string = environment.wikiApiUrl;
      wikiList: WikiModel[] = [];
     constructor(

      protected http: HttpClient,) {}

        getwikiList() {
          return this.http.get(this.wikiApiUrl + "/list")
            .pipe(map((data: any[]) => {return this.wikiList = data;
                }), catchError(error => {
                return throwError('Its a Trap!')
              })
            );
        }
    }

订阅该数据

知识库管理组件

    import { Component, OnInit } from '@angular/core';
import { KnowledgeBaseService } from '../../../services/knowledge-base.service';
import { WikiModel } from '../../../../models/wikiItems.model';
import { map, take } from 'rxjs/operators';
import {keyframes} from '@angular/animations';

@Component({
  selector: 'app-knwoledge-center-admin',
  templateUrl: './knowledge-base-admin.component.html',
  styleUrls: ['./knowledge-base-admin.component.scss']
})
export class KnowledgeBaseAdminComponent implements OnInit {

  wikiList: WikiModel[] = [];
  displayDialog: boolean = false;
  editItem: WikiModel = null;

  constructor(private knowledgebaseService: KnowledgeBaseService) {

  }

  ngOnInit() {
    this.getwikiItems()
  }

  getwikiItems(): void {
    this.knowledgebaseService.getwikiList().subscribe(
      data => {
        this.wikiList = data
      },
      err => console.error(err),
      () => console.log('Wiki Items Geladen')
    );
    console.log(this.wikiList)
  }

  showDialogToAdd() {
    this.displayDialog = true;

  }  showDialogToEdit() {
    this.displayDialog = true;
  }
}

维基模型

export class WikiModel {
  title: string;
  text: string;
  keyWords: string;

}

模板 银行 贝格里夫 备考 香菜 {{wikiItems.title}} {{wikiItems.text}} {{wikiItems.keyWords}}

    <div class="ui-g-12">
      <div class="ui-g-4">
        <label for="wikiTitle">Titel</label>
      </div>
      <div class="ui-g-8">
        <input pInputText id="wikiTitle" />
      </div>
    </div>
    <div class="ui-g-12">
      <div class="ui-g-4">
        <label for="wikiText">Wiki Text</label>
      </div>
      <div class="ui-g-8">
          <textarea id="wikiText" [rows]="5" [cols]="35" pInputTextarea ></textarea>
      </div>
    </div>
<!-- TODO: change  textfield to P-chips -->
    <div class="ui-g-12">
      <div class="ui-g-4">
        <label for="wikikeywords">Schlagwörter</label>
      </div>
      <div class="ui-g-8">
        <input pInputText id="wikikeywords" />
      </div>
    </div>
  </div>
</p-dialog>

错误

ERROR Error: Error trying to diff '[object Object]'. Only arrays and iterables are allowed

来自 API 的数据如下所示:

{
  "error": null,
  "status": 200,
  "result": [
    {
      "_key": "338330",
      "_id": "knowbaseItems/338330",
      "_rev": "XIQvCoG--",
      "title": "Test Eintrag",
      "text": "Lalala",
      "keyWords": [
        "test"
      ]
    },
    {
      "_key": "341705",
      "_id": "knowbaseItems/341705",
      "_rev": "XIHSQhy--",
      "title": "Personalpronomen",
      "text": "Fahren Schlitten",
      "keyWords": [
        "ich",
        "du",
        "er"
      ]
    }
  ],
  "code": "200"
}

【问题讨论】:

  • 请张贴所有模板部分。

标签: angular api fetch primeng ngfor


【解决方案1】:

在您的服务地图操作员必须返回 data.result

getwikiList() {
 return this.http.get(this.wikiApiUrl + "/list")
            .pipe(map((data: any) => data.result ), 
                  catchError(error => { return throwError('Its a Trap!')})
            );
}

像这样更新 p-table

<p-table  [value]="wikiList">
       <ng-template pTemplate="header">
         <tr>
           <th>Begriff</th>
           <th>Beschreibung</th>
           <th>Schlagworte</th>
         </tr>
       </ng-template>
       <ng-template pTemplate="body" let-wikiList>
         <tr>
           <td>{{wikiList.title}}</td>
           <td>{{wikiList.text}}</td>
           <td>{{wikiList.keyWords}}</td>
         </tr>
       </ng-template>
     </p-table>

stackblitz example ?

【讨论】:

  • @HolzbeinWilli 你检查过我更新的答案吗返回data.result
  • 你能给我wikiApiUrl吗? @HolzbeinWilli
  • 是的,删除了那个错误,但我的表仍然是空的.. ;/我的控制台输出现在看起来像这样.. Knowledge-base-admin.component.ts:34 [] length : 0 proto : Array(0) concat : ƒ concat() 构造函数 : ƒ Array() copyWithin : ƒ copyWithin() 条目 : ƒ entries() every : ƒ every() 填充
  • 它是一个本地 API..从外部 ArangoDB 服务器获取数据 API 路由如下所示:localhost:3100/knowledge-base/list 此 URL 提供了所有存储数据的完整列表。输出如下:{“错误” :null,"status":200,"result":[{"key":"341705","_id":"knowbaseItems/341705","_rev":"_XIHSQhy--", "title":"Personalpronomen","text":"Fahren Schlitten","keyWords":["ich","du","er"]}],"code":"200"}
  • @HolzbeinWilli 我已经更新了答案,希望对这里有所帮助:),查看 stackblitz 示例
【解决方案2】:

请记住,Http 是异步的。这意味着使用此代码:

  getwikiItems(): void {
    this.knowledgebaseService.getwikiList().subscribe(
      data => {
        this.wikiList = data
      },
      err => console.error(err),
      () => console.log('Wiki Items Geladen')
    );
    console.log(this.wikiList)  // <-- ALWAYS UNDEFINED!!
  }

console.log 的最后一行总是未定义。

流程如下:

1) 调用 getwikiList().subscribe。

2) Http Get 请求被执行。

3) getwikiList() 方法返回。

4) 你的 console.log 被执行,此时值未定义。

5) 收到来自 Get 请求的响应。

6) 订阅方法中定义的方法被通知,数据被提供并设置到this.wikilist。

所以只有在第 6 步之后才能获得数据。

如果您想查看您的值,您需要将您的日志移动订阅中,如下所示:

  getwikiItems(): void {
    this.knowledgebaseService.getwikiList().subscribe(
      data => {
        this.wikiList = data;
        console.log(this.wikiList); // <-- here instead
      },
      err => console.error(err),
      () => console.log('Wiki Items Geladen')
    );
  }

【讨论】:

    【解决方案3】:

    您还可以执行以下操作:

    getwikiList() {
    return this.http.get(this.wikiApiUrl + "/list")
            .pipe(map((data: any) => data.result || [];
                }), catchError(error => {
                return throwError('Its a Trap!')
              })
            );
    

    它对我有用

    【讨论】:

      猜你喜欢
      • 2018-11-25
      • 2021-01-09
      • 2020-08-15
      • 2019-10-26
      • 2021-12-21
      • 2020-05-27
      • 2018-07-15
      • 2021-04-20
      相关资源
      最近更新 更多