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;
  }
}

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

감사!



아 그래 ng-show와 함께 좋은 트릭. 대단히 감사합니다
Adrian Gunawan 2013 년

답변:


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 요청으로 데이터를 가져 오면 반환 된 데이터가 표시되기 전에 지연이 발생하며 그 시간에는 "Nothing here!"가 표시됩니다. 부분이 나타나고 사라집니다.
Temega 2014 년

@Temega - 당신은 DIV에 클래스에 "NG 숨기기"를 추가 할 수 있습니다
브라이언 올리버

3
@Temega ng-show = "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
하지만이 경우 필터가 두 번 실행됩니다.이를 피할 수있는 방법이 있습니까?
Isaiah

이 솔루션에 감사드립니다. 여기에 제공된 groupBy 필터 github.com/a8m/angular-filter를 사용 했지만 안타깝게도 위의 답변이 작동하지 않습니다. 이 방법은 필터를 두 번 실행할 수 있지만 상관없이 문제를 해결했습니다.
Anthony

제 경우에는 "== 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

1
다른 예를 찾을 수 없습니다. 이것은 그들의 애니메이션 문서에서 "숨겨져"있고 우연히 내가 그것을 필요로하는 날에 그것을 발견했거나 기억하지 못했을 것이라고 생각했습니다.
caiocpricci2
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.