typescript - Angular içinde nesne dizisindeki nesneyi güncelleme
Diyelim ki aşağıdaki nesne dizisine sahibim, buna itemArray diyelim;
{
"totalItems": 2,
"items": [
{
"id": 1,
"name": "foo"
},
{
"id": 2,
"name": "bar"
},
]
}
Ve sadece id 2'nin güncellenmiş sonucunu döndüren bir aboneliğim var. Tüm diziye döngü uygulamadan nesne dizisini nasıl güncelleyebilirim?
İstediğim şey aşağıdaki örneğe benzer bir şey;
updateUser(user){
this.myservice.getUpdate(user.id)
.subscribe(newitem => {
this.updateArray(newitem);
});
}
updateArray(newitem){
this.itemArray.items[newitem.id].name = newitem.name
}
ya da daha da iyisi, tüm nesneyi değiştirmek;
updateArray(newitem){
this.itemArray.items[newitem.id] = newitem
}
Bu örnek, diziyi dizinin indeksine göre güncelliyor. Peki yeni öğe id'sine göre nasıl güncelleyebilirim?
Yorumda talep edilen şablon:
<tr *ngFor="let u of itemsArray.items; let i = index">
<td>{{ u.id }}</td>
<td>{{ u.name }}</td>
<td>
<input type="checkbox" checked="u.accepted" [(ngModel)]="itemsArray.items[i].accepted" (ngModelChange)="updateUser(u)">
<label for="singleCheckbox-{{i}}"></label>
</td>
</tr>
Cevap #1
Güncelleme :
showUpdatedItem(newItem){
let indexToUpdate = this.itemArray.items.findIndex(item => item.id === newItem.id);
this.itemArray.items[indexToUpdate] = newItem;
// some angular libraries require breaking the array reference
// to pick up the update in the array and trigger change detection.
// In that case, you can do following
this.itemArray.items = Object.assign([], this.itemArray.items);
}
Stackblitz Demo
Orijinal Yanıt:
Bu Plunker'ı, nesneyi newItem.id ile eşit olacak şekilde güncelleyen örneğiniz temel alarak oluşturdum
İşte fonksiyonlarımın bir kesiti:
showUpdatedItem(newItem){
let updateItem = this.itemArray.items.find(this.findIndexToUpdate, newItem.id);
let index = this.itemArray.items.indexOf(updateItem);
this.itemArray.items[index] = newItem;
}
findIndexToUpdate(newItem) {
return newItem.id === this;
}
Cevap #2
Argüman olarak geçirilen öğeyi doğrudan güncellemek işi görmeli, ama belki burada bir şeyi kaçırıyor olabilirim?
updateItem(item){
this.itemService.getUpdate(item.id)
.subscribe(updatedItem => {
item = updatedItem;
});
}
DÜZENLE : Eğer gerçekten öğenizi güncellemek için tüm dizinizde dolaşmaktan başka seçeneğiniz yoksa, findIndex kullanın :
let itemIndex = this.items.findIndex(item => item.id == retrievedItem.id);
this.items[itemIndex] = retrievedItem;
Cevap #3
Başka bir yaklaşım şöyle olabilir:
let myList = [{id:'aaa1', name: 'aaa'}, {id:'bbb2', name: 'bbb'}, {id:'ccc3', name: 'ccc'}];
let itemUpdated = {id: 'aaa1', name: 'Another approach'};
myList.find(item => item.id == itemUpdated.id).name = itemUpdated.name;
