The following AngularJS application is working with ng-repeat and an applied filter. A certain applied filter leaves no values left. How can I display a notification?
js fiddle
HTML
<div > <div data-ng-controller="myCtrl"> <ul > <li data-ng-repeat="item in values | filter:filterIds()"> <code>#{{item.id}}</code> Item </li> </ul> <p ng-show="!values.length">no vals with this filter</p> <button ng-click="loadNewFilter()"> filter now</button> </div> </div>
AngularJS
var app = angular.module('m', []); app.controller('myCtrl', function ($scope) { $scope.values = [{ id: 1 }, .... }]; $scope.filter = [1,2,3,4,5,6]; $scope.filterIds = function (ids) { return function (item) { var filter = $scope.filter; return filter.indexOf(item.id) !== -1; } } $scope.loadNewFilter = function (){ $scope.filter = [-1]; $scope.$apply(); } });
You can consider using transclusion inside a custom directive, to achieve the behavior you are looking for without using ng-repeat.
The ng-repeat values can be filtered according to the ng-model in AngularJS by using the value of the input field as an expression in a filter. We can set the ng-model directive on an input field to filter ng-repeat values.
Note: The $index variable is used to get the Index of the Row created by ng-repeat directive. Each row of the HTML Table consists of a Button which has been assigned ng-click directive. The $index variable is passed as parameter to the GetRowIndex function.
You can use $last variable within ng-repeat directive. Take a look at doc. Where computeCssClass is function of controller which takes sole argument and returns 'last' or null .
I think this is what you want:
var app = angular.module('myApp', []); app.controller('myCtrl', function ($scope) { $scope.values = [ {id: 1}, {id: 2}, {id: 3}, {id: 4}, {id: 5}, {id: 6}]; $scope.filter = [1,2,3,4,5,6]; $scope.filterIds = function (ids) { return function (item) { var filter = $scope.filter; return filter.indexOf(item.id) !== -1; } } $scope.loadNewFilter = function (){ $scope.filter = [1,5]; } });
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> <div ng-app="myApp"> <div data-ng-controller="myCtrl"> <ul> <li data-ng-repeat="item in testValue=(values | filter:filterIds())"> <code>#{{item.id}}</code> Item </li> </ul> <p ng-show="!testValue.length">no vals with this filter</p> <button ng-click="loadNewFilter()"> filter now</button> </div> </div>
FIDDLE LINK
This is Another one FIDDLE LINK check this also
I would go with very simple CSS approach:
HTML:
<ul> <li data-ng-repeat="item in values | filter:filterIds()"> <code>#{{item.id}}</code> Item</li> <li class="no-items">There are no matching items.</li> </ul>
CSS:
li + .no-items { display: none; }
So basically li.no-items
is only visible if there are no other LI
's and hidden otherwise. I think this is better for performance than introducing one more watcher with ngShow/ngHide
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With