Как добавить/вставить элемент в ObservableArray в определенном месте с помощью Knockout.js

Все примеры нокаута, которые я нашел, похоже, добавляют новый элемент в конец ObservableArray, используя что-то вроде:

viewModel.SomeItems.push(someNewItem);

Это, конечно, помещает элемент в конец массива.

Как добавить элемент в ObservableArray в определенной позиции?

например. что-то вроде:

viewModel.SomeItems.push(someNewItem, indexToInsertItAt);

Ответ 1

Вы можете использовать собственный метод JavaScript splice -

viewModel.SomeItems.splice(2,0,someNewItem);

Документы здесь - https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/splice

Пример здесь (не специфичный для нокаута) - Как вставить элемент в массив по определенному индексу?

Из документов Knockout -

Для функций, которые изменяют содержимое массива, например, push и сплайсинг, методы KO автоматически запускают отслеживание зависимостей чтобы все зарегистрированные слушатели были уведомлены об изменении, и ваш пользовательский интерфейс автоматически обновляется.

Ответ 3

Я сделал эту функцию расширения, которая хорошо работала для меня. Splice не работал у меня, если бы я добавлял к концу разреженного массива.

ko.observableArray.fn.setAt = function(index, value) {
    this.valueWillMutate();
    this()[index] = value;
    this.valueHasMutated();
}

Это даже работает с:

var a = ko.observableArray(['a', 'b', 'c']);
a.setAt(42, 'the answer');