Angular js - Показать сообщение, если ng-repeat пуст
Следующее приложение AngularJS работает с ng-repeat и применяемым фильтром. Определенный использованный фильтр не оставляет никаких значений. Как я могу отобразить уведомление?
js скрипка
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();
}
});
Ответы
Ответ 1
Я думаю, что это то, что вы хотите:
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>
Ответ 2
Я бы пошел с очень простым CSS-подходом:
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;
}
Таким образом, в основном li.no-items
отображается только в том случае, если нет других LI
и скрытых в противном случае. Я думаю, что это лучше для производительности, чем введение еще одного наблюдателя с ngShow/ngHide
.
Ответ 3
Здесь рабочий пример: http://jsfiddle.net/z9daLbLm/2/
Вы можете сохранить результат фильтра в ng-repeat
<div ng-repeat="item in filteredValues = (values | filter:filterIds())">{{item}}</div>
Результат сохраняется в filteredValues
Затем используйте эти отфильтрованные значения в DOM
<div ng-show="!filteredValues.length">No Items</div>
Ответ 4
См. здесь http://jsfiddle.net/ntofav3c/
измените это:
<p ng-show="!values.length">no vals with this filter</p>
в
<p ng-hide="values | filter:filterIds()">no vals with this filter</p>
Ответ 5
См. этот рабочий jsfiddle: http://jsfiddle.net/z9daLbLm/4/
Я добавил этот код перед вашим <ul>
списком
<div ng-if="(values|filter:filterIds()).length == 0">
List is empty
</div>
Он просто показывает текст "Список пуст", когда длина отфильтрованных значений равна нулю.
Для получения дополнительной информации обратитесь к этой ссылке: Как отобразить длину отфильтрованных данных ng-repeat
Ответ 6
Для этого вы можете использовать ng-switch.
Например:
` <div ng-app ng-controller="friendsCtrl">
<label>Search: </label><input ng-model="searchText" type="text">
<div ng-init="filtered = (friends | filter:searchText)">
<h3>'Found '{{(friends | filter:searchText).length}} friends</h3>
<div ng-switch="(friends | filter:searchText).length">
<span class="ng-empty" ng-switch-when="0">No friends</span>
<table ng-switch-default>
<thead>
<tr>
<th>Name</th>
<th>Phone</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="friend in friends | filter:searchText">
<td>{{friend.name}}</td>
<td>{{friend.phone}}</td>
</tr>
</tbody>
</table>
</div>`
Ответ 7
Недавно я столкнулся с такими же проблемами.
У меня было три фильтра и один orderBy в ng-repeat и мне хотелось показать несколько сообщений EmptyList....
Вышеупомянутые решения не помогли. Я сделал один из своих.
- Создал emptymsg в качестве фона div и mainContainer как верхний div.
- Показать пустой divsMsg всегда, поэтому всякий раз, когда в списке нет значения, пустым будет только отображение div.
PS: фрагмент кода не запускается... потому что дополнительные библиотеки не добавляются. Это просто для того, чтобы дать вам представление!
//empty msg....
.emptyMsg{
position: absolute;
left: 0;right: 0;
margin: auto;
color: gray;
text-align: center;
font-size:3.0em;
z-index: 0;
}
.activityItem {
margin: 0px !important;
padding: 0px !important;
border: 0px !important;
}
.mainContainer {
z-index: 999;
width: 100%;
height: 40px;
left: 0px;
margin-top: 10px;
display: inline-block;
}
<h4>List of Activities</h4>
<ion-list>
<div class="emptyMsg">No Activities found!</div>
<div class="item activityItem" ng-repeat="activity in activities | orderBy:field1Order:order.reverse1 | filter:importanceFilter | filter:motiveFilter track by $index">
<div class="mainContainer">
<div class="divBar">{{activity.energy}}%</div>
</div>
</div>
</ion-list>