Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Angular js - Show message if ng-repeat is empty

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(); }  }); 
like image 666
user1477955 Avatar asked Sep 16 '14 10:09

user1477955


People also ask

What can I use instead of NG-repeat?

You can consider using transclusion inside a custom directive, to achieve the behavior you are looking for without using ng-repeat.

How do I filter in 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.

How do I find the NG-repeat index?

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.

Where is the last element in NG-repeat?

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 .


2 Answers

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

like image 118
Rajamohan Anguchamy Avatar answered Sep 28 '22 13:09

Rajamohan Anguchamy


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.

Demo: http://jsfiddle.net/z9daLbLm/5/

like image 33
dfsq Avatar answered Sep 28 '22 13:09

dfsq