Как заменить данный индекс в observableArray другим элементом.
У меня есть:
ViewModel.Elements () [index]
как я могу заменить его другим элементом.
observableArrays имеют метод replace
. Это берет старый предмет и новый предмет.
Итак, вы бы назвали его следующим образом:
ViewModel.Elements.replace(ViewModel.Elements()[index], yourNewElement);
Внутренне это просто устанавливает этот индекс для вашего нового элемента и вызывает valueHasMutated (), чтобы уведомить любых потенциальных подписчиков.
Как правильно указывает dvijaz, принятый ответ заменяет данное значение. Это может вызвать проблемы, когда данное значение не является уникальным в массиве.
Вместо того, чтобы разрезать массив и затем склеить массив обратно, я сделал следующее, что более читабельно ИМХО:
ViewModel.Elements()[index] = yourNewElement;
ViewModel.Elements.valueHasMutated();
Спасибо Р.П. Нимейеру за то, что он указал, как .replace
работает внутри.
Вы также можете расширить observableArray
для поддержки этого:
ko.observableArray.fn.replaceIndex = function(index, newValue) {
this.valueWillMutate();
this()[index] = newValue;
this.valueHasMutated();
};
Что означает, что вы можете делать следующее:
var arr = ko.observableArray([1, 2, 1, 4]);
arr.replaceIndex(2, 3);
console.log(arr()); // logs [1, 2, 3, 4]
Редактирование базового массива и его переназначение помогли мне. У меня были проблемы с другими подходами.
var underlyingArray = this.someObservableArray();
// Do modifications... Swap some items...
// No one is being notified just yet...
// Reassign to observable to update everything
this.someObservableArray(underlyingArray);