Ich arbeite an Winkel 8.
- Ich habe eine Seite, die eine Tabelle anzeigt. Die Tabelle zeigt Daten aus einem Objektarray an
taskList
die die Komponente als erhält@Input()
. - Ich habe eine Sortierfunktion für die Spalten dieser Tabelle.
- Ich habe auch eine Löschoption für jede Zeile. Wenn ich auf die Option „Löschen“ klicke, wird ein API-Aufruf zum Löschen der Zeile und dann ein weiterer Aufruf zum Abrufen der Zeile ausgeführt
tasklist
Array. Dies ist der Effekt, der für dasselbe gilt
@Effect()
DeleteTask$: Observable<Action> = this.actions$.pipe(
ofType(importActions.DELETE_TASK),
switchMap(params =>
this.globalService
.deleteTask(params)
.mergeMap(deleteSuccess => {
return from([
new importActions.DeleteTaskSuccess(deleteSuccess),
new importActions.LoadTaskList(),
]);
})
.catch((error, caught) => {
return Observable.of(new GlobalError(error));
}),
),
);
Mein Problem ist, dass die Sortierfunktion beim Laden der ersten Seite einwandfrei funktioniert. Aber wenn ich eine Zeile lösche und dann nach dem Löschen die Aufgabenliste abrufe, erhalte ich die folgende Fehlermeldung:
ERROR Error: Uncaught (in promise): TypeError: Cannot assign to read only property '0' of object '[object Array]'
TypeError: Cannot assign to read only property '0' of object '[object Array]'
Gemäß der Fehlermeldung gibt die folgende Funktion in meinem Code den Fehler aus
exchange(a, b) {
const temp = this.taskList[a];
this.taskList[a] = this.taskList[b]; //this line gives error
this.taskList[b] = temp;
}
Diese Funktion ist der Teil eines Sortiercodes, der die verwendet tasklist
Array und sortiert es.
Das Fließwesen ngOnchanges(detects change is taskList array) calls --> this.taskChange('export_name', 'asc') based on some condition calls --> this. exchange(a, b)
Es folgt meine ngOnchanges-Methode
ngOnChanges(changes: SimpleChanges) {
if (this.taskList !== null && this.taskList !== undefined) {
this.taskChange('export_name', 'asc');
}
}
Nachfolgend finden Sie die Hauptsortiermethode
async taskChange(value, taskOrder) {
this.sortOrder = taskOrder;
this.selectedValue = value;
const expr = {
asc: (a, b) => a > b,
desc: (a, b) => a < b,
};
for (let i = 0; i < this.taskList.length; i++) {
for (let j = i + 1; j < this.taskList.length; j++) {
switch (value) {
case 'export_name':
if (
expr[this.sortOrder](this.taskList[i].name, this.taskList[j].name)
) {
this.exchange(i, j);
}
break;
case 'file_type':
let type1;
let type2;
type1 = this.exportType.transform(this.taskList[i].code, []);
type2 = this.exportType.transform(this.taskList[j].code, []);
if (expr[this.sortOrder](type1, type2)) {
this.exchange(i, j);
}
break;
}
}
}
}
Ich bin mir nicht sicher, was genau diesen Fehler verursacht, wenn sich das Array zum zweiten Mal ändert. Ich habe eine Menge Dinge ausprobiert, aber keines davon hat funktioniert. Nach dem, was ich online gefunden habe, könnte dies passieren, weil ich versuche, ein als @Input empfangenes Array zu ändern. Aber der obige Code, der das Array „tasklist“ verändert, funktioniert beim ersten Laden der Seite. Und funktioniert erst dann nicht mehr, wenn sich das Array ändert. Könnte mir jemand helfen?
Das ist nicht das richtige Paradigma für NGRX. Sortieren Sie innerhalb Ihres Selektors.
– Pixelbits
22. November 2020 um 20:06 Uhr