У меня странная проблема из-за allIpRecords: any;
, в которой я хочу сохранить копию ipRecords: any;
, потому что в исходном коде ipRecords
может измениться, и я хочу сохранить предыдущую копию в allIpRecords
Проблема заключается в том, что всякий раз, когда запускается функция вставки, и если у меня есть this.allIpRecords = res.data;
внутри функции вставки, то в обоих массивах ipRecords
и this.allIpRecords
создаются дубликаты записей вставленной строки, и в таблице одна и та же строка отображается два раза. Если я удалю this.allIpRecords
, то ничего подобного не произойдет, в массиве будет только одна запись вставленных элементов.
Несмотря на то, что в базу данных он вставляется только один раз, в локальном массиве он отображается два раза.
<td>
<span></span>
</td>
<td>
<input type = "text" [(ngModel)] = "newData.ip" />
</td>
<td>
<input type = "text" [(ngModel)] = "newData.forDomain" />
</td>
<td>
<input type = "text" [(ngModel)] = "newData.status" />
</td>
<td>
<input type = "text" [(ngModel)] = "newData.senderEmail" />
</td>
<td>
<button class = "common-btn" type = "button" (click) = "insert()">Insert</button>
</td>
</tr>
<tr *ngFor = "let record of ipRecords" class = "colour02">
<td>{{record.id}}</td>
<td *ngIf = "record.id === editRowId"><input type = "text" [(ngModel)] = "record.ip" ></td>
<td *ngIf = "record.id !== editRowId">{{record.ip}}</td>
<td *ngIf = "record.id === editRowId"><input type = "text" [(ngModel)] = "record.forDomain" ></td>
<td *ngIf = "record.id !== editRowId">{{record.forDomain}}</td>
<td *ngIf = "record.id === editRowId"><input type = "text" [(ngModel)] = "record.status" ></td>
<td *ngIf = "record.id !== editRowId">{{record.status}}</td>
<td *ngIf = "record.id === editRowId"><input type = "text" [(ngModel)] = "record.senderEmail" ></td>
<td *ngIf = "record.id !== editRowId">{{record.senderEmail}}</td>
<td>
<br>
Ц
private newData: any = {};
ipRecords: any;
allIpRecords: any;
ngOnInit() {
this.auth.getAllIpRecords().subscribe((res: any)=>{
this.ipRecords = res.data;
this.allIpRecords = res.data;
}
}
insert() {
if (Object.keys(this.newData).length === 0) {
this.toastr.error("Empty record");
return;
}
this.auth.addIpRecord(this.newData).subscribe((res: any)=>{
if (res.status === "Success") {
this.newData = {};
this.ipRecords.push(res.data);
this.allIpRecords.push(res.data);
}
}
В обеих переменных вы передаете одну и ту же ссылку на объект -
this.ipRecords = res.data;
this.allIpRecords = res.data;
Таким образом, модификация любой одной переменной изменит их все, потому что они являются одной и той же ссылкой.
Чтобы решить эту проблему, клонируйте рез.данные, а затем назначьте его переменным. Это легко сделать, используя JSON.stringify() и JSON.parse().
this.ipRecords = JSON.parse(JSON.stringify(res.data));
this.allIpRecords = JSON.parse(JSON.stringify(res.data));
Вы можете найти более подробную информацию о клонировании объектов ЗДЕСЬ
Они ссылаются на одни и те же данные. Вроде указателей. Итак, на самом деле это всего лишь одни данные, но вы можете получить к ним доступ через две ссылки.
Представьте, что у вас есть работа по дому, где вы храните коробки. Вы можете добавлять или удалять ящики через одну дверь, а когда вы войдете через другую, вы увидите изменения в ящиках.
Это работает, но не может понять, что оба массива совершенно разные, но один влияет на другой только потому, что у них одинаковые данные.