Замена элемента в наблюдаемом массиве
Я пытаюсь заменить все содержимое элемента в observableArray
на новый контент.
var oldLocation = ko.utils.arrayFirst(self.locations(), function (item) {
return item.id == value.id;
});
self.locations.replace(self.locations.indexOf(oldLocation), new location(value));
self.locations.valueHasMutated();
Я также пробовал
self.locations[self.locations.indexOf(location)] = new fizi.ko.models.location(value);
Но ничего не работает. Индекс правильно извлекается, но обновление элемента не происходит.
Ответы
Ответ 1
Функция замены принимает два параметра, элемент, который вы хотите заменить, и новый элемент, который вы хотите заменить. Вы заменяете индекс вместо заменяемого элемента, чтобы он не работал.
Вызов замены должен быть:
self.locations.replace(oldLocation, new location(value));
На боковой ноте вам не нужен вызов valueHasMutated()
, он будет вызван вызовом replace()
.
Ответ 2
Я просто хочу упомянуть альтернативный способ сделать это:
self.locations.splice(
self.locations.indexOf(location), // Index of the 1st element to remove
1, // Number of elements to remote at this index
new fizi.ko.models.location(value) // A param for each element to add at the index
);
Нокаут включает в себя splice
в своей документации, но не включает replace
: Документы для нокаутных защищенных массивов. Однако, если вы посмотрите на исходный код, вы увидите, что обе функции реализованы (по крайней мере, в KO 3.0, я не знаю, было ли replace
отсутствовало в предыдущих версиях).
Ответ 3
Я не знаю о методе замены в javascript для массивов или в нокауте. Я что-то пропустил?
Если вы хотите использовать свой второй метод, вам необходимо получить доступ к местоположениям в качестве наблюдаемого:
self.locations()[self.locations.indexOf(location)] = new fizi.ko.models.location(value);
self.locations.valueHasMutated();
хотя вы не используете indexOf, так как есть версия для нокаута для наблюдаемых массивов.