Error: NG0900: Error trying to diff '[object Object]'. Only arrays and iterables are allowed
Error: NG0900: Error trying to diff '[object Object]'. Only arrays and iterables are allowed
我目前正在开发 crud 应用程序的前端部分。出现此错误时我正在实施惰性分页
Error: NG0900: Error trying to diff '[object Object]'. Only arrays and iterables are allowed
我已经调查了很多有同样错误的问题,但我没有找到任何解决方案
Obs:已经尝试使用管道 | keyvalue
,没有用
这是我传递给分页的对象的一部分 = cidades:
[
{
"id": 6,
"nome": "Florianópolis",
"qtdHabitantes": null,
"estado": "SC"
},
...
]
这是我发出请求的服务:
import { HttpClient, HttpParams } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs';
import { environment } from 'src/environments/environment';
import { Pageable } from '../pageable';
import { RequestUtil } from '../request-util';
import { Cidade } from './cidade';
import { CidadeFiltro } from './cidadeFiltro';
@Injectable({
providedIn: 'root'
})
export class CidadeService {
apiUrl = environment.apiUrl;
cidadesUrl = environment.slashApi + '/cidades';
constructor(private http: HttpClient) { }
listar(filtro: CidadeFiltro, pageable: Pageable): Observable<any>{
const options = RequestUtil.buildOptions(Object.assign(filtro, pageable));
return this.http.get<any>(`${this.cidadesUrl}`, options);
}
...
我的component.ts:
export class CidadesComponent implements OnInit, OnChanges {
@ViewChild('grid') grid: any;
cidades: any[] = [];
estado = new Estado();
estados = [];
estadoSelected:any = '';
filtro = new CidadeFiltro();
pageable = new Pageable();
totalRegistros = 0;
@BlockUI('lista-cidades') blockUI!: NgBlockUI;
constructor(private cidadeService:CidadeService, private messageService: MessageService ) { }
ngOnChanges(changes: SimpleChanges): void {
this.cidades = this.cidades
}
ngOnInit() {
this.listar();
this.estados = this.estado.estados;
}
listar(pagina:number = 0){
this.blockUI.start();
this.filtro.estado = this.estadoSelected.name;
this.pageable.page = pagina;
this.cidadeService.listar(this.filtro, this.pageable).pipe(finalize(() => this.blockUI.stop())).subscribe(data => {
this.totalRegistros = data.totalElements;
this.cidades = data.content;
}),
retry(3),
catchError(error => {
console.log('Não foi possível listar as cidades');
return of(0);
});
}
最后我的 component.html
<div *blockUI="'lista-cidades'">
<p-table [value]="cidades" #grid
[lazy]="true" [totalRecords]="registros" (onLazyLoad)="aoMudarPagina($event)"
[paginator]="true" [rows]="size" responsiveLayout="scroll">
<ng-template pTemplate="emptymessage">
<tr><td>Nenhuma cidade encontrada</td></tr>
</ng-template>
<ng-template pTemplate="header">
<tr>
<th>Nome</th>
<th>Habitantes</th>
<th>Estado</th>
<th>Ações</th>
</tr>
</ng-template>
<ng-template pTemplate="body" let-cidade>
<tr>
<td>{{cidade.nome}}</td>
<td>{{cidade.qtdHabitantes | number}}</td>
<td>{{cidade.estado}}</td>
<td class="acoes">
<button pButton icon="pi pi-pencil" pTooltip="Editar" tooltipPosition="top" [routerLink]="['/cidades', cidade.id]"></button>
<button pButton class="p-button-danger" icon="pi pi-trash" pTooltip="Excluir" tooltipPosition="top"
(click)="deletar(cidade)"></button>
</td>
</tr>
</ng-template>
</p-table>
</div>
错误日志:
ERROR Error: NG0900: Error trying to diff '[object Object]'. Only arrays and iterables are allowed
at DefaultIterableDiffer.diff (core.mjs:27502)
at NgForOf.ngDoCheck (common.mjs:3170)
at callHook (core.mjs:2552)
at callHooks (core.mjs:2511)
at executeCheckHooks (core.mjs:2443)
at refreshView (core.mjs:9493)
at refreshEmbeddedViews (core.mjs:10609)
at refreshView (core.mjs:9508)
at refreshComponent (core.mjs:10655)
at refreshChildComponents (core.mjs:9280)
有人可以帮助我吗?
更新
我考虑过在 listar()
方法中实现这段代码:
listar(pagina:number = 0){
this.blockUI.start();
this.filtro.estado = this.estadoSelected.name;
this.pageable.page = pagina;
this.cidadeService.listar(this.filtro, this.pageable).pipe(finalize(() => this.blockUI.stop())).subscribe(data => {
this.totalRegistros = data.totalElements;
this.cidades.push(data.content);
this.cidades = this.cidades[0];
console.log(this.cidades)
})
但是我得到了错误
ERROR TypeError: Cannot read properties of undefined (reading 'push')
我的列表变空了
突然想到的一件事是您使用的是 any 类型。
在服务中做一些事情,例如 return this.http.get 将确保响应将被解析为 Cidades 数组,并且可能会在出现问题时通知您。 (我不记得具体是不是不能抛出)
此外,请改用 cidades: Cidades[] = [];
,当分配了其他内容时,您可能会看到问题出在哪里。
尽可能避免使用 any
类型,否则您将失去所有类型安全性并且可能会发生奇怪的事情。
例如,如果将不是 Cidades[] 的其他东西分配给 this.cidades,编译器将在设计时抱怨,您可以看到发生了什么。
由于我没有使用您的代码创建项目,所以我不知道具体是什么错误。
我目前正在开发 crud 应用程序的前端部分。出现此错误时我正在实施惰性分页
Error: NG0900: Error trying to diff '[object Object]'. Only arrays and iterables are allowed
我已经调查了很多有同样错误的问题,但我没有找到任何解决方案
Obs:已经尝试使用管道 | keyvalue
,没有用
这是我传递给分页的对象的一部分 = cidades:
[
{
"id": 6,
"nome": "Florianópolis",
"qtdHabitantes": null,
"estado": "SC"
},
...
]
这是我发出请求的服务:
import { HttpClient, HttpParams } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs';
import { environment } from 'src/environments/environment';
import { Pageable } from '../pageable';
import { RequestUtil } from '../request-util';
import { Cidade } from './cidade';
import { CidadeFiltro } from './cidadeFiltro';
@Injectable({
providedIn: 'root'
})
export class CidadeService {
apiUrl = environment.apiUrl;
cidadesUrl = environment.slashApi + '/cidades';
constructor(private http: HttpClient) { }
listar(filtro: CidadeFiltro, pageable: Pageable): Observable<any>{
const options = RequestUtil.buildOptions(Object.assign(filtro, pageable));
return this.http.get<any>(`${this.cidadesUrl}`, options);
}
...
我的component.ts:
export class CidadesComponent implements OnInit, OnChanges {
@ViewChild('grid') grid: any;
cidades: any[] = [];
estado = new Estado();
estados = [];
estadoSelected:any = '';
filtro = new CidadeFiltro();
pageable = new Pageable();
totalRegistros = 0;
@BlockUI('lista-cidades') blockUI!: NgBlockUI;
constructor(private cidadeService:CidadeService, private messageService: MessageService ) { }
ngOnChanges(changes: SimpleChanges): void {
this.cidades = this.cidades
}
ngOnInit() {
this.listar();
this.estados = this.estado.estados;
}
listar(pagina:number = 0){
this.blockUI.start();
this.filtro.estado = this.estadoSelected.name;
this.pageable.page = pagina;
this.cidadeService.listar(this.filtro, this.pageable).pipe(finalize(() => this.blockUI.stop())).subscribe(data => {
this.totalRegistros = data.totalElements;
this.cidades = data.content;
}),
retry(3),
catchError(error => {
console.log('Não foi possível listar as cidades');
return of(0);
});
}
最后我的 component.html
<div *blockUI="'lista-cidades'">
<p-table [value]="cidades" #grid
[lazy]="true" [totalRecords]="registros" (onLazyLoad)="aoMudarPagina($event)"
[paginator]="true" [rows]="size" responsiveLayout="scroll">
<ng-template pTemplate="emptymessage">
<tr><td>Nenhuma cidade encontrada</td></tr>
</ng-template>
<ng-template pTemplate="header">
<tr>
<th>Nome</th>
<th>Habitantes</th>
<th>Estado</th>
<th>Ações</th>
</tr>
</ng-template>
<ng-template pTemplate="body" let-cidade>
<tr>
<td>{{cidade.nome}}</td>
<td>{{cidade.qtdHabitantes | number}}</td>
<td>{{cidade.estado}}</td>
<td class="acoes">
<button pButton icon="pi pi-pencil" pTooltip="Editar" tooltipPosition="top" [routerLink]="['/cidades', cidade.id]"></button>
<button pButton class="p-button-danger" icon="pi pi-trash" pTooltip="Excluir" tooltipPosition="top"
(click)="deletar(cidade)"></button>
</td>
</tr>
</ng-template>
</p-table>
</div>
错误日志:
ERROR Error: NG0900: Error trying to diff '[object Object]'. Only arrays and iterables are allowed
at DefaultIterableDiffer.diff (core.mjs:27502)
at NgForOf.ngDoCheck (common.mjs:3170)
at callHook (core.mjs:2552)
at callHooks (core.mjs:2511)
at executeCheckHooks (core.mjs:2443)
at refreshView (core.mjs:9493)
at refreshEmbeddedViews (core.mjs:10609)
at refreshView (core.mjs:9508)
at refreshComponent (core.mjs:10655)
at refreshChildComponents (core.mjs:9280)
有人可以帮助我吗?
更新
我考虑过在 listar()
方法中实现这段代码:
listar(pagina:number = 0){
this.blockUI.start();
this.filtro.estado = this.estadoSelected.name;
this.pageable.page = pagina;
this.cidadeService.listar(this.filtro, this.pageable).pipe(finalize(() => this.blockUI.stop())).subscribe(data => {
this.totalRegistros = data.totalElements;
this.cidades.push(data.content);
this.cidades = this.cidades[0];
console.log(this.cidades)
})
但是我得到了错误
ERROR TypeError: Cannot read properties of undefined (reading 'push')
我的列表变空了
突然想到的一件事是您使用的是 any 类型。
在服务中做一些事情,例如 return this.http.get
此外,请改用 cidades: Cidades[] = [];
,当分配了其他内容时,您可能会看到问题出在哪里。
尽可能避免使用 any
类型,否则您将失去所有类型安全性并且可能会发生奇怪的事情。
例如,如果将不是 Cidades[] 的其他东西分配给 this.cidades,编译器将在设计时抱怨,您可以看到发生了什么。
由于我没有使用您的代码创建项目,所以我不知道具体是什么错误。