Mapping
Подробнее следовать. На данный момент, вот простой пример:
var sourceItems = ko.observableArray([1, 2, 3, 4, 5]);
Существует простой наблюдаемый массив. Теперь предположим, что мы хотим, чтобы следить за квадратов этих значений:
var squares = sourceItems.map(function(x) { return x*x; });
Теперь squares
является наблюдаемым массив, содержащий [1, 4, 9, 16, 25]
. Давайте изменим исходные данные:
sourceItems.push(6);
// 'squares' has automatically updated and now contains [1, 4, 9, 16, 25, 36]
Это работает с любым преобразованием исходных данных, например .:
sourceItems.reverse();
// 'squares' now contains [36, 25, 16, 9, 4, 1]
Ключевым моментом этой библиотеки является то, что эти преобразования эффективно сделано . В частности, ваша функция обратного вызова, которая выполняет , отображение вызывается только в случае крайней необходимости (обычно это только для вновь добавленных элементов). Когда вы добавляете новые элементы в исходные данные , нам не необходимо пересмотреть существующие. Когда вы переупорядочиваете исходные данные, порядок вывода соответственно изменяется без переназначение чего-либо.
Эта эффективность может не имеет большого значения, если вы просто квадратуры номера, но когда вы отображение сложных вложенных графиков пользовательских объектов, может иметь важное значение для выполнения каждого обновления отображения с Minumum из работы.
Фильтрация
Как map
, этот плагин также filter
:
var evenSquares = squares.filter(function(x) { return x % 2 === 0; });
// evenSquares is now an observable containing [36, 16, 4]
sourceItems.push(9);
// This has no effect on evenSquares, because 9*9=81 is odd
sourceItems.push(10);
// evenSquares now contains [36, 16, 4, 100]
Опять же, ваши filter
обратного вызова вызывается только при строго необходимо. Переупорядочение или удаление исходных элементов не требует повторной фильтрации - выход просто обновляется для соответствия. Только новые объекты должны быть подвергнуты обратному вызову filter
.
Нет такой вещи, встроенной в основную библиотеку KO. Поэтому вам нужно реализовать свою логику «фильтра» в обычных функциях js или с помощью ko.computeds. Однако есть плагин под названием: [Knockout.Punches] (http://mbest.github.io/knockout.punches/), который обеспечивает угловую фильтрацию фильтра: http://mbest.github.io/knockout.punches/ # Встроенные фильтры – nemesv
Я думаю, что плагин [нокаут-проекции] (https://github.com/stevesanderson/knockout-projections) - это то, что вы ищете. Он позволяет создавать наблюдаемые массивы, созданные из функций «map» и 'filter', применяемых к другому наблюдаемому массиву. –