У меня есть массив данных, который содержит много объектов (формат JSON). Следующее может быть принято в качестве содержимого этого массива:
var data = [
{
"name": "Jim",
"age" : 25
},
{
"name": "Jerry",
"age": 27
}
];
Теперь я отображаю эти детали как:
<div ng-repeat="person in data | filter: query">
</div
Здесь запрос моделируется в поле ввода, в котором пользователь может ограничить отображаемые данные.
Теперь у меня есть другое местоположение, в котором я отображаю текущее количество отображаемых людей / человек, т.е. Showing {{data.length}} Persons
Что я хочу сделать, так это то, что когда пользователь ищет человека и отображаемые данные фильтруются на основе запроса, Showing...persons
также меняются значения людей, которые отображаются в данный момент. Но этого не происходит. В нем всегда отображается общее количество людей в данных, а не в отфильтрованном. Как узнать количество отфильтрованных данных?
источник
$scope.filtered.length
.undefined
, вероятно, потому что во время регистрации, переменная еще не определена. Итак, как мне убедиться, что код в контроллере запускается после того, как переменная была определена и фильтр был применен в представлении?$scope.$watch('filtered', function() { console.log('filtered:', $scope.filtered); });
person in data | filter:query as filtered | limitTo:5
. Поэтому я должен был использовать предыдущую версию 1.3:person in filtered = (data | filter: query) | limitTo: 5
Для полноты, в дополнение к предыдущим ответам (выполнить расчет видимых людей внутри контроллера), вы также можете выполнить эти вычисления в своем HTML-шаблоне, как в примере ниже.
Предполагая, что ваш список людей находится в
data
переменной и вы фильтруете людей, используяquery
модель, следующий код будет работать для вас:{{data.length}}
- печатает общее количество людей{{(data|filter:query).length}}
- печатает отфильтрованное количество людейОбратите внимание, что это решение отлично работает, если вы хотите использовать отфильтрованные данные только один раз на странице. Однако если вы используете отфильтрованные данные более одного раза, например, для представления элементов и для отображения длины отфильтрованного списка, я бы предложил использовать выражение псевдонима (описанное ниже) для AngularJS 1.3+ или решение, предложенное @Wumms для версии AngularJS до версии 1.3.
Новая функция в Angular 1.3
Создатели AngularJS также заметили эту проблему и в версии 1.3 (бета 17) они добавили выражение «псевдоним», которое будет хранить промежуточные результаты ретранслятора после применения фильтров, например
Выражение псевдонима позволит предотвратить многократный вопрос выполнения фильтра.
Я надеюсь, что это поможет.
источник
{{(data|filter:query|filter:query2).length}}
Самый простой способ, если у вас есть
Длина отфильтрованных данных
источник
ngRepeat создает копию массива, когда применяет фильтр, поэтому вы не можете использовать исходный массив для ссылки только на отфильтрованные элементы.
В вашем случае может быть лучше применить фильтр внутри вашего контроллера, используя
$filter
сервис:И тогда вы используете
filteredData
свойство в вашем представлении вместо этого. Вот рабочий Плункер: http://plnkr.co/edit/7c1l24rPkuKPOS5o2qtx?p=previewисточник
{{filteredData.length}}
вместоdata.length
. Я также понял, чтоmyInputModel
модель сопоставлена с входным запросом, который фильтрует данные.val
будет текст, который вводится во ввод (в основном запрос), но каждый раз, когда я печатаю, он меняется. Но чтоfilterFilter
здесь? Я мог бы добавить, что у меня есть свой собственный customFilter (в котором я могу указать, какой ключ объекта следует учитывать при фильтрации).ng-repeat="person in filteredData"
как нет смысла фильтровать его дважды. С$filter
обслуживанием, вы можете задать для конкретного фильтра, просто суффикса его «Фильтр», например:dateFilter
,jsonFilter
и т.д. Если вы используете свой собственный фильтр, просто используйте один вместо родовогоfilterFilter
.Начиная с AngularJS 1.3 вы можете использовать псевдонимы:
и где-то:
Из документов :
источник
$scope.$watch
этот псевдоним результат. Любые советы по$broadcast
использованию псевдонимаresults
переменной?Также полезно отметить, что вы можете хранить несколько уровней результатов, группируя фильтры.
вот демо скрипка
источник
Вот сработал пример смотри на Plunker
источник
Вы можете сделать это двумя способами . В шаблоне и в контроллере . В шаблоне вы можете установить свой отфильтрованный массив для другой переменной, а затем использовать его, как вы хотите. Вот как это сделать:
Если вам нужны примеры, посмотрите примеры / демоверсии отфильтрованного количества AngularJs
источник