AngularJS-占位符,用于过滤器的空结果


95

我想要一个占位符,例如<No result>当过滤器结果返回空时。谁能帮忙吗?我什至不知道从哪里开始...

HTML

<div ng-controller="Ctrl">
<h1>My Foo</h1>
<ul>
    <li ng-repeat="foo in foos">
        <a href="#" ng-click="setBarFilter(foo.name)">{{foo.name}}</a>
    </li>
</ul>
<br />
<h1>My Bar</h1>
<ul>
    <li ng-repeat="bar in bars | filter:barFilter">{{bar.name}}</li>
</ul>

</div>

JS

function Ctrl($scope) {

  $scope.foos = [{
    name: 'Foo 1'
  },{
    name: 'Foo 2'
  },{
    name: 'Foo 3'
  }];

  $scope.bars = [{
    name: 'Bar 1',
    foo: 'Foo 1'
  },{
    name: 'Bar 2',
    foo: 'Foo 2'
  }];

  $scope.setBarFilter = function(foo_name) {
    $scope.barFilter = {};
    $scope.barFilter.foo = foo_name;
  }
}

jsFiddlehttp : //jsfiddle.net/adrn/PEumV/1/

谢谢!



嗯是ng-show好招。非常感谢
Adrian Gunawan

Answers:


252

对只需要一次指定过滤器的方法进行了调整:

  <li ng-repeat="bar in filteredBars = (bars | filter:barFilter)">{{bar.name}}</li>
</ul>
<p ng-hide="filteredBars.length">Nothing here!</p>

小提琴


6
这是更好的解决方案,因为您只需要声明一次过滤器。+1
Tim B James

1
问题是“这里什么都没有!” 显示和隐藏部分很快。当您使用ajax请求获取数据时,在显示返回的数据之前会有一个延迟,此时您可以看到“这里什么都没有!”。部分出现和消失。
Temega 2014年

@Temega-您可以在div中添加“ ng-hide”类
Brian Oliver

3
@Temega你可以使用NG-秀= “filteredBars.length === 0”
mantish

我使用ng-controller =“ FooController as $ ctrl”并做了“ bar in $ ctrl.filteredBars =(bars | filter:barFilter)”,所以我甚至可以在ng-repeat之外使用$ ctrl.filteredBars.length。感谢您的史诗般的提示!
xlttj

37

这是使用ng-show的技巧

HTML:

<div ng-controller="Ctrl">
<h1>My Foo</h1>
<ul>
    <li ng-repeat="foo in foos">
        <a href="#" ng-click="setBarFilter(foo.name)">{{foo.name}}</a>
    </li>
</ul>
<br />
<h1>My Bar</h1>
<ul>
    <li ng-repeat="bar in bars | filter:barFilter">{{bar.name}}</li>
</ul>
<p ng-show="(bars | filter:barFilter).length == 0">Nothing here!</p>

</div>

jsFiddle: http : //jsfiddle.net/adrn/PEumV/2/


2
但是在这种情况下,过滤器将执行两次,有没有办法避免这种情况?
以赛亚书

感谢您的解决方案。我一直在使用此处提供的GROUPBY过滤github.com/a8m/angular-filter但高于不幸的是,接受的答案不是没有工作。此方法可以执行两次过滤器,但是无论如何都可以解决问题。
安东尼

在我的情况下,它可以不使用“ == 0”。<p ng-show =“(bars | filter:barFilter).length”>这里什么都没有!</ p>
Alessio

22

取自这份正式文件的做法是:

ng-repeat="friend in friends | filter:q as results"

然后将结果用作数组

<li class="animate-repeat" ng-if="results.length == 0">
  <strong>No results found...</strong>
</li>

完整摘要:

<div ng-controller="repeatController">
I have {{friends.length}} friends. They are:
<input type="search" ng-model="q" placeholder="filter friends..." aria-label="filter friends" />


<ul class="example-animate-container">
    <li class="animate-repeat" ng-repeat="friend in friends | filter:q as results">
      [{{$index + 1}}] {{friend.name}} who is {{friend.age}} years old.
    </li>
    <li class="animate-repeat" ng-if="results.length == 0">
      <strong>No results found...</strong>
    </li>
  </ul>
</div>

4
我怀疑自从首次提出这个问题以来情况就发生了变化,但是鉴于目前这正是Angular的文档建议您解决问题的方式,因此我认为这是正确的做法。
jackel414 '16

1
我找不到另一个例子。在他们的动画文档中,这是“隐藏的”,这是偶然的,我在需要它的同一天注意到了它,或者我不记得自己。
caiocpricci2 '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.