<div>
<h1>Birds</h1>
<ul>
<li ng-if="bird.type === 'bird'"
ng-repeat="bird in creatures">{{bird.name}}</li>
</ul>
</div>
我收到服务器的回复,我想把它放到列表中。但是当列表为空时我需要隐藏这个div容器。例如,如果bird.type === 'bird'
不在数组中 - 我想隐藏div。但我想在ng-repeat之后使用鸟,所以我不能在ng-if="bird.type === 'bird'"
上div
。我可以检查li是否为空,然后隐藏div?
AngularJS ng-repeat handle empty list case - 它不一样。我不想隐藏li如果它是空的,我想隐藏父亲我在哪里h1 - 当李是空的时候。
答案 0 :(得分:4)
您可以执行以下操作:
<div ng-if="hasBirds(creatures)">
<h1>Birds</h1>
<ul>
<li ng-if="bird.type === 'bird'"
ng-repeat="bird in creatures">{{bird.name}}</li>
</ul>
</div>
然后在控制器/指令中添加hasBirds
函数。
$scope.hasBirds = function(list){
return list.filter(function(item){return item.type === 'bird'}).length > 0;
}
这个hasBirds
函数会经常调用,但会允许你隐藏/显示鸟类的标题。
答案 1 :(得分:2)
在您的示例中,我建议您使用过滤器而不是使用“ng-if”,您应该创建一个过滤器,如:
angular.module('moduleName').filter(birdsFilter);
function birdsFilter(creature) {
return creature.type == 'bird';
}
使用过滤器,您可以像这样重写代码:
<div ng-hide="birds.length">
<h1>Birds</h1>
<ul>
<li ng-repeat="bird in birds = (creatures | filter:birdsFilter)">{{bird.name}}</li>
</ul>
</div>
答案 2 :(得分:2)
IMO,其中一些答案将有效。但它们都没有理想的优化。我建议您在控制器/ postlink函数中过滤数据。
$scope.animals = {
dogs: $scope.creates.filter(function(a){return a.type == 'dog'}),
cats: $scope.creates.filter(function(a){return a.type == 'cat'}),
birds: $scope.creates.filter(function(a){return a.type == 'bird'}),
fishes: $scope.creates.filter(function(a){return a.type == 'fish'})
};
这样你就只能在一个地方处理一次生物数组。摘要周期永远不必重新评估数组以查看是否需要更新DOM。这是你的标记,如下所示:
<div ng-if="animals.birds.length">
<h1>Birds</h1>
<ul>
<li ng-repeat="bird in animals.birds">{{bird.name}}</li>
</ul>
</div>
答案 3 :(得分:1)
您应该根据类型过滤列表,将过滤后的项目存储在范围属性中,然后使用该属性显示或隐藏div。
<div ng-show="birds.length">
<h1>Birds</h1>
<ul>
<li ng-repeat="bird in creatures | filter:birdType as birds">{{bird.name}} </li>
</ul>
</div>
然后在控制器中实现birdType过滤器功能:
$scope.birdType = function(creature) {
return creature.type === 'bird';
};
答案 4 :(得分:1)
如果长度为零,则使用ng-show="cats.length"
使div
消失。
根据this SO post中讨论的cat in creatures | filter:{type: 'cat'} as cats
等对象属性过滤内联。
工作示例:
var app = angular.module('App', []);
app.filter(birdsFilter);
function birdsFilter(creature) {
return creature.type == 'bird';
}
app.controller('Ctrl', function($scope) {
$scope.creatures = [
{
name : 'Cho-cho',
type : 'bird'
},
{
name : 'Floo-floo',
type : 'dog'
},
{
name : 'Pou-pou',
type : 'bird'
},
{
name : 'Oop-flup',
type : 'bird'
},
{
name : 'Chio-mio',
type : 'cat'
},
{
name : 'Floo-floo',
type : 'dog'
},
{
name : 'Loo-Li',
type : 'dog'
},
{
name : 'Pops-Mops',
type : 'bird'
},
{
name : 'Boo-Moo',
type : 'dog'
},
{
name : 'Iop-Pio',
type : 'dog'
},
{
name : 'Floop-cho',
type : 'bird'
}
]
});
&#13;
<!DOCTYPE html>
<html ng-app="App">
<head>
<script data-require="angularjs@1.5.7" data-semver="1.5.7" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.7/angular.min.js"></script>
<link rel="stylesheet" href="style.css" />
<script src="script.js"></script>
</head>
<body ng-controller="Ctrl">
<div ng-show="birds.length">
<h1>Birds</h1>
<ul>
<li ng-repeat="bird in creatures | filter:{type: 'bird'} as birds">{{bird.name}} </li>
</ul>
</div>
<div ng-show="dogs.length">
<h1>Dogs</h1>
<ul>
<li ng-repeat="dog in creatures | filter:{type: 'dog'} as dogs">{{dog.name}} </li>
</ul>
</div>
<div ng-show="cats.length">
<h1>Cats</h1>
<ul>
<li ng-repeat="cat in creatures | filter:{type: 'cat'} as cats">{{cat.name}} </li>
</ul>
</div>
<div ng-show="fishes.length">
<h1>Fish</h1>
<ul>
<li ng-repeat="fish in creatures | filter:{type: 'fish'} as fishes">{{fish.name}} </li>
</ul>
</div>
</body>
</html>
&#13;