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.