Подтвердить что ты не робот

Замена элемента в наблюдаемом массиве

Я пытаюсь заменить все содержимое элемента в 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);

Но ничего не работает. Индекс правильно извлекается, но обновление элемента не происходит.

4b9b3361

Ответ 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, так как есть версия для нокаута для наблюдаемых массивов.