Как заменить заданный элемент индекса в knockoutjs

Как заменить данный индекс в observableArray другим элементом.

У меня есть: ViewModel.Elements () [index]

как я могу заменить его другим элементом.

24
задан RP Niemeyer 9 January 2012 в 03:41
поделиться

3 ответа

observableArrays имеют метод replace. Это берет старый предмет и новый предмет.

Итак, вы бы назвали его следующим образом:

ViewModel.Elements.replace(ViewModel.Elements()[index], yourNewElement);

Внутренне это просто устанавливает этот индекс для вашего нового элемента и вызывает valueHasMutated (), чтобы уведомить любых потенциальных подписчиков.

38
ответ дан 28 November 2019 в 22:52
поделиться

Как правильно указывает 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]
5
ответ дан 28 November 2019 в 22:52
поделиться

Редактирование базового массива и его переназначение помогли мне. У меня были проблемы с другими подходами.

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);
0
ответ дан 28 November 2019 в 22:52
поделиться