Я реализую функцию поиска в AngularJS, и я хочу, чтобы там было сообщение "Результаты не найдены", когда нет совпадений. Поскольку я фильтрую только некоторые из полей, а не все из них, я написал отдельную функцию фильтра, которая применяется в ng-if
проверить, соответствует ли запись поиску или нет. Теперь мне нужно подсчитать полученные панели ПОСЛЕ завершения ng-repeat
, поэтому я попытался использовать директиву after-repeat
и присвоить значение переменной results
в моем SearchController
внутри этой директивы, но это ничего не делает.
HTML:
<div ng-if="searchctrl.results<1">No matches.</div>
<uib-accordion close-others="true">
<uib-accordion-group ng-if="searchfilter(lokal)" is-open="isopen" ng-repeat="lokal in lokale | orderBy:'name'" after-repeat>
[...]
</uib-accordion-group>
</uib-accordion>
app.js (с контроллером для моего SearchController):
var app = angular.module('ZoiglApp', ['ngAnimate', 'ui.bootstrap', 'ngRoute', 'ngTouch', 'leaflet-directive']);
app.config(function($routeProvider) {
$routeProvider
[...]
.when('/search/:searchterm', {
controller: 'SearchController',
controllerAs:'searchctrl',
templateUrl: 'views/search.html'
})
.otherwise({
redirectTo: '/home'
});
});
afterRepeat.js:
app.directive('afterRepeat', function() {
return {
restrict: 'A',
link: function(scope, elem, attrs) {
if(scope.$last) {
scope.searchctrl.results = angular.element('.panel').length;
}
}
};
});
edit: Я все еще ищу решение. Я ответил на два предложения ниже своими проблемами с ними. Было бы очень приятно, если бы кто-то попытался найти мою ошибку
Просто отфильтруйте свой список в другом контроллере и используйте его в своем представлении.
$scope.filteredLokale = $filter('filter')($scope.lokale, { param: "paramValue" });
После этого получите счетчик с параметром "длина".
<uib-accordion close-others="true">
<uib-accordion-group is-open="isopen" ng-repeat="lokal in filteredLokale | orderBy:'name'" >
[...]
</uib-accordion-group>
</uib-accordion>
{{ filteredLokale .length }}
Вы должны создать угловой фильтр для функции searchFilter
вместо ng-if
. Затем вы можете назначить фильтрованный массив переменной, называемой filteredLokale
как это
<uib-accordion-group ng-repeat="lokal in lokale | orderBy:'name' | searchFilter as filteredLokale">
</uib-accordion-group>
Length: {{filteredLokale.length}}
ng-repeat="lokal in lokale | searchFilter:st | orderBy:'name'"
(st - это моя поисковая строка), и он работает, но я не могу получить это работает изнутри контроллера, он возвращает пустой массив. Я пробовал$scope.filteredLokale = $filter('searchFilter')($scope.lokale, {st: $scope.st});
а также$scope.filteredLokale = $filter('searchFilter')($scope.lokale, $scope.st);