2013-05-07 2 views
0

У меня есть наблюдаемый массив с именем администратора. У меня также есть объект с именем adminToAdd. AdminToAdd содержит один элемент с теми же свойствами, что и администраторы. Я могу подтолкнуть adminToAdd к администраторам без проблем.Обновление наблюдаемого массива в нокауте

К сожалению, я не могу обновить существующий элемент в администраторах. Я получаю элемент для обновления в adminToAdd. Я пробовал

vm.administrators.replace(vm.administrators.indexOf(vm.adminToAdd), vm.adminToAdd); 

но хотя структура между ними не совпадает, индекс не будет соответствовать. Я просмотрел несколько примеров, но ни один из них не работает для моего сценария. Есть идеи?

+0

«adminToAdd» наблюдаемый или простой объект? – Jalayn

+0

Объект с наблюдаемыми свойствами. – rross

ответ

1

Причина, по которой ваш подход не работает, заключается в том, что при использовании indexOf при попытке найти объект, а не значение. При поиске объекта он использует адреса памяти для определения равенства, а не значений объекта.

Я люблю функцию полезности ko ko.utils.arrayFirst(array, predicate) для подобных ситуаций. Это позволяет вам искать определенный элемент в массиве и возвращать его, если он найден. Вы предоставляете функцию предиката, которая вернет true в случае, если объект равен или false для чего-либо еще.

var existingItem = ko.utils.arrayFirst(vm.administrators(), function (item) { 
    return <true or false statement> //define what constitutes equal here; 
}); 

if (existingItem) { 
    vm.administrators.remove(existingItem); 
    vm.administrators.push(vm.adminToAdd()); 
} 
else { 
    //case where it wasn't in the array 
} 
+0

@rross Не уверен, были ли объекты внутри «администраторов» сами наблюдаемыми, но я могу обновить пример, если это так. –

Смежные вопросы