【问题标题】:Angular : Error trying to diff '[object Object]'. Only arrays and iterables are allowedAngular:尝试区分“[object Object]”时出错。只允许使用数组和可迭代对象
【发布时间】:2020-08-15 10:55:40
【问题描述】:


我知道了 Error trying to diff '[object Object]'. Only arrays and iterables are allowed 当我尝试获取更新数据时出现此错误

获取代码:

allDatas
  allData(data) {
    this.allDatas = data
  }

好的,这是我写的更新代码:

updateTodo(currentTodo){  
       // console.log(currentTodo)
        this._todo.updateTask(currentTodo).subscribe(
          data=>{console.log(data);this.allData(data)},
          error=>console.log(error)
        )
  }

此请求来自 Service.ts

updateTask(todo:TodoModel):Observable<TodoModel>{
    return this._http.put<TodoModel>('http://127.0.0.1:3000/todo/updateTodo/'+todo.id,todo,headerOption)
  }

我使用 cosole.log 检查了所有内容,最后我得到了错误所在的行,让我告诉你

updateTodo(currentTodo){  
           // console.log(currentTodo)
            this._todo.updateTask(currentTodo).subscribe(
              data=>{console.log(data);this.allData(data)}, //Error Comes from this line----------
              error=>console.log(error)
            )
      }

这是相同的更新代码:当我在更新代码中写入 data=&gt;console.log(data) 时,不再显示错误,但是当我使用 data=&gt;{console.log(data);this.allData(data)} 时出现此错误:

HTML:我绑定数据的地方:

<tbody *ngFor="let t of allDatas;let i= index">
                <tr class="table-success" *ngIf="t && t.complited">
                    <td>{{t.task}}</td>
                    <td>{{t.date.year+"-"+t.date.month+"-"+t.date.day}}</td>
                    <td> {{t.complited}}</td>
                    <td>
                        <i class="fa fa-times-circle btn idelete" style="font-size:25px;" (click)="putTrue(t)"></i>
                        <i class="fa fa-edit btn iedit" style="font-size:25px;color:rgb(31, 12, 12)" (click)="editTodo(t)"></i>
                        <i class="fa fa-trash-o btn idelete" style="font-size:25px;" (click)="deleteTask(t.id)"></i>
                    </td>
                </tr>
                <tr class="table-danger" *ngIf="t && !t.complited">
                    <td>{{t.task}}</td>
                    <td>{{t.date.year+"-"+t.date.month+"-"+t.date.day}}</td>
                    <td> {{t.complited}}</td>
                    <td>
                        <i class="fa fa-check-circle btn idone" style="font-size:25px;" (click)="putTrue(t)"></i>
                        <i class="fa fa-edit btn iedit" style="font-size:25px;color:rgb(31, 12, 12)" (click)="editTodo(t)"></i>
                        <i class="fa fa-trash-o btn idelete" style="font-size:25px;" (click)="deleteTask(t.id)"></i>
                    </td>
                </tr>
            </tbody>

所以 allDatas 是一个数组:

JSON 数据:执行所有操作的地方

[{"id":29,"task":"random 5","date":{"year":2020,"month":5,"day":9},"category":"genral","complited":false},null,{"id":31,"task":"task 32","date":{"year":2020,"month":5,"day":31},"category":"genral","complited":false}]


总之,当我更新任务和获取更新任务时出现错误,但我使用相同的方法发布其他数据,我得到了完美的结果
请有人帮助我,我一直在尝试解决这个错误......

【问题讨论】:

  • 您需要显示使用this.allDatas 变量的模板。看起来 API 正在返回一个对象,您可能正在尝试使用 *ngFor 指令对其进行循环。
  • 这能回答你的问题吗? Error trying to diff '[object Object]' in Angular
  • 我认为没有数组或对象的问题,因为在 post 方法中我使用相同的方法在那里它工作正常
  • 你得到的数据类型不是数组??我在控制台中看到的是一个示例对象
  • i 添加 HTML 代码我将日期绑定为不同,因为格式问题我也通过删除日期进行检查,但它显示相同的错误

标签: javascript angular typescript


【解决方案1】:

试试这个
如果你使用 this.allDatas = data; allDatas 刷新并且 'allDatas' 等于 'data'。
如果你使用 this.allDatas.push(data);新添加到“allDatas”中的“数据”

首先创建一个数组 allDatas : Array = [];

   allDatas : Array<any> = [];

updateTodo(currentTodo){  
          // console.log(currentTodo)
            this._todo.updateTask(currentTodo).subscribe(
              data=>{
               console.log(data);
               this.allDatas = data;
});
      }

【讨论】:

  • 嘿,我试过这段代码,但它在代码errorInCode 中给出错误,然后我编辑你的代码,最后我放 [](括号)但仍然无法正常工作 output 当我单击更新任务它会删除所有记录
  • 对不起,我们没有创建数组...请像这样添加数组 allDatas : Array = [];
【解决方案2】:

此错误与您的 html 文件中的 *ngFor 循环有关。 它基本上说allDatas 不是一个数组。

使用“typeof”验证allDatas 的类型,确保它是一个数组。

编辑
我看到了第二张图片,它看起来像是一个数组。
还请尝试使用在线验证工具验证该数组。在 Google 中搜索 json 验证器。

还将*ngFor 循环从&lt;tbody&gt; 移动到&lt;tr&gt;

祝你好运

【讨论】:

  • 它是一个数组类型,我还附上了它是一个数组类型的图像,如果我错了请检查并告诉我
【解决方案3】:

尝试初始化所有数据:this.allDatas=[]

updateTodo(currentTodo){  
          // console.log(currentTodo)
            this._todo.updateTask(currentTodo).subscribe(
              data=>{
               this.allDatas=[]
               console.log(data);
               this.allDatas.push(data)
}

            )
      }

但最好的解决方案是将 API 的返回类型更改为数组 []

【讨论】:

  • 我使用 .push 方法,但它每次都推送新数据,并且它是一个 UPDATE api ...检查 service.ts 它的 put api
  • 我在推送数据之前更新列表中的答案
  • 好的,我试过了,但它推送新数据不执行 put(Update) 方法
  • [你的输出](imgur.com/a/qSSyj7g当我刷新所有推送的项目时都消失了,还删除了我用来更新的记录
  • 我认为错误[object object]现在已经解决了,你还需要找出为什么数据不符合预期
【解决方案4】:

根据我从您的代码中了解到的情况,您收到错误是因为您在 allData 方法中将对象分配给数组。

在订阅 PUT 请求时,您会收到一个对象而不是数组。

这就是您的 allData 方法的样子:

allData(data) {
 this.allDatas.push(data);
}

【讨论】:

  • 我使用 .push 方法,但它每次都会推送新数据,并且它是一个 UPDATE api
  • Your Output 嘿我运行你的代码,但它没有更新我的记录它只是重复推送值,当我刷新它时删除所有推送值和原始记录的值
  • PUT 请求(更新)在请求正文中返回 JSON 对象而不是数组。该对象是您更新的待办事项。我假设你得到了上面提到的那种行为,因为你也在使用 allData 方法来获取所有待办事项。如果是这种情况,您应该保留该方法,因为您已经拥有它,并且在订阅更新请求时,您应该拥有this.allDatas.push(data)(在这种情况下,数据是对象)。如果不起作用,请创建一个复制代码的堆栈闪电战。
  • 我再次这样做你想说什么我完全理解让我向你展示代码并输出code & Output在这里你可以找到2个代码和输出图像所以当我点击更新时它会推送新任务时间和当我刷新页面时,所有推送的数据都消失了,因为它在变量中的更新不在实际数据库(JSON 文件)中。
  • 嗯,在我看来,您没有按应有的方式从服务器获取数据。您可以发布有关如何从服务器检索整个待办事项的代码吗?当您更新待办事项时,您是否从服务器收到任何错误?您还应该检查您的网络选项卡以查看请求是否在更新后为您提供 200 状态代码。
猜你喜欢
  • 2021-12-21
  • 2018-11-25
  • 2020-05-27
  • 2018-07-15
  • 2021-01-09
  • 2021-04-20
  • 2018-09-14
  • 2019-10-26
相关资源
最近更新 更多