2015-08-19 6 views
0

имеет встроенную концепцию , поэтому очень просто уменьшить набор данных до тех элементов, которые соответствуют, например, пользовательскому вводу.Есть ли что-то вроде фильтров AngularJS для Knockout.js?

Есть ли что-то подобное для ?

Конечно, я мог бы реализовать его самостоятельно, используя простой старый Javascript, но я не эксперт по производительности, поэтому мое собственное решение, вероятно, было бы ужасно медленным.

+1

Нет такой вещи, встроенной в основную библиотеку KO. Поэтому вам нужно реализовать свою логику «фильтра» в обычных функциях js или с помощью ko.computeds. Однако есть плагин под названием: [Knockout.Punches] (http://mbest.github.io/knockout.punches/), который обеспечивает угловую фильтрацию фильтра: http://mbest.github.io/knockout.punches/ # Встроенные фильтры – nemesv

+1

Я думаю, что плагин [нокаут-проекции] (https://github.com/stevesanderson/knockout-projections) - это то, что вы ищете. Он позволяет создавать наблюдаемые массивы, созданные из функций «map» и 'filter', применяемых к другому наблюдаемому массиву. –

ответ

3

Да, Steve Sanderson создал плагин knockout-projections для нокаута.

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

Этот пример из проектов GitHub ридми демонстрирует использование и объясняет, как map и filter обратные вызовы выполняются эффективно:

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.

 Смежные вопросы

  • Нет связанных вопросов^_^