AngularJS ng- 반복 핸들 빈 목록 케이스


377

나는 이것이 매우 일반적인 것이라고 생각했지만 AngularJS에서 처리하는 방법을 찾을 수 없었습니다. 이벤트 목록이 있고 AngularJS로 출력하고 싶다고 가정하면 매우 쉽습니다.

<ul>
    <li ng-repeat="event in events">{{event.title}}</li>
</ul>

그러나 목록이 비어있는 경우 어떻게 처리합니까? 목록에 "이벤트 없음"또는 이와 유사한 메시지 상자가있는 메시지 상자를 갖고 싶습니다. 가까이 오는 유일한 것은 ng-switchwith입니다 events.length(배열이 아닌 객체가 비어있을 때 어떻게 확인합니까?), 이것이 내가 가진 유일한 옵션입니까?


4
@Artem의 대답은 좋습니다 (+1). 다음은 참조 / 비교를 위해 필터를 사용하는 Google 그룹 토론입니다. groups.google.com/d/topic/angular/wR06cN5oVBQ/discussion
Mark Rajcok

답변:


569

ngShow 를 사용할 수 있습니다 .

<li ng-show="!events.length">No events</li>

예를 참조하십시오 .

또는 ngHide 를 사용할 수 있습니다

<li ng-hide="events.length">No events</li>

예를 참조하십시오 .

객체의 경우 Object.keys 를 테스트 할 수 있습니다 .


1
사실 @ArtemAndreev. "events"가 빈 배열 인 경우 배열이 비어 있어도 true를 반환합니다.
Rob Juurlink

Object.keys에 문제가 있다고 생각합니다 : jsfiddle.net/J9b5z , 어떻게 처리합니까?
Dani

5
nh-show가 내 경우에는 효과가 있었지만 필터를 넣고 아무것도 반환 할 때 상태를 업데이트하지 않습니다. 또한 첫 번째로드시 오브젝트가 나타나고 페이지로드시 반복 프로세스가 완료되면 사라집니다.
dvdmn 2016 년

1
@Dani는 테스트를 수행하는 기능을 컨트롤러에 추가해보십시오. 그런 다음로 지시문을 호출 할 수 있습니다 ng-hide="hasEvents()".
Mr. S

예, 고마워요 그러나 컨트롤러를 "오염"시키지 않으면 서 더 우아한 방법이 있기를 바랐습니다.
Dani

370

필터링 된 목록과 함께 이것을 사용하려면 깔끔한 트릭이 있습니다.

<ul>
    <li ng-repeat="item in filteredItems  = (items | filter:keyword)">
        ...
    </li>
</ul>
<div ng-hide="filteredItems.length">No items found</div>

3
매우 유용한. "filteredFragments"를 사용한 오타.
ravishi

1
단! ng-repeat 내부의 표현은 이상하게 보입니다. 당신이 그것을 설명 할 수 있습니까? 감사!!
MK Safi

7
@MKSafi, 그것은 호출 된 스코프에 새로운 변수를 만들고 filteredItems그 값을 (items | filter:keyword)필터로 반환 된 배열로 설정합니다
AlexFoxGill

17
예! 닌자 플러스 포인트! 이렇게하면 복잡한 필터를 두 번 평가할 필요가 없습니다.
markmarijnissen 2014 년

2
또한 여러 필터를 사용하면 이와 관련하여 몇 가지 제한 사항이있는 것처럼 "face in filteredFaces = faces|filter:{deleted: true} | orderBy:'text'보이지만 모두에게 동의합니다. 이것은 멋진 트릭입니다.
Fitter Man

29

목록이 비어있을 때 DOM에서을 제거하려면 angular-ui 지시문 을 확인하십시오 .ui-iful

<ul ui-if="!!events.length">
    <li ng-repeat="event in events">{{event.title}}</li>
</ul>

1
감사. 숨기는 것보다 깨끗합니다.
Prinzhorn

@ Mortimer : 따라서이 경우 angular-ui가 필요합니까?
Shibbir Ahmed

ng-hideangular-ui없이 사용할 수 있지만 노드를 숨기면 DOM 트리에서 제거되지 않습니다. angular-ui의 ui-if지시문을 사용하면 DOM 노드가 제거됩니다. 따라서 적어도 ui-ifangular-ui 코드 의 지시문을 자신의 코드에 추가해야 합니다.
Mortimer

21
최신 각도가 ng-if포함되어 있습니다!
markmarijnissen 2014 년

4
존재하지 않는 ng-if새로운 범위를 만들고 있음 에 유의하십시오 ng-hide. 예기치 않은 동작이 발생할 수 있습니다.
아놀드 다니엘스

29

최신 버전의 angularjs에서는이 질문에 대한 올바른 대답은 다음을 사용하는 것입니다 ng-if.

<ul>
  <li ng-if="list.length === 0">( No items in this list yet! )</li>
  <li ng-repeat="item in list">{{ item }}</li>
</ul>

메시지를 표시하려면 목록을 정의해야하고 길이가 0이기 때문에 목록을 다운로드하려고 할 때이 솔루션이 깜박 거리지 않습니다.

다음은 사용중인 플런저입니다. http://plnkr.co/edit/in7ha1wTlpuVgamiOblS?p=preview

팁 : 로딩 텍스트 또는 스피너를 표시 할 수도 있습니다.

  <li ng-if="!list">( Loading... )</li>

23
<ul>
    <li ng-repeat="item in items | filter:keyword as filteredItems">
        ...
    </li>
    <li ng-if="filteredItems.length===0">
        No items found
    </li>
</ul>

이것은 @Konrad 'ktoso'Malawski와 비슷하지만 약간 기억하기 쉽습니다.

Angular 1.4로 테스트


3
당신은 의미ng-if='!filteredItems.length'
abrunet

여러 필터를 사용하여이 작업을 어떻게 수행합니까?
Jordash

@Jordash 그냥 계속 파이핑하십시오 item in items | filter: ... | filter: ...
Bernard

더 훌륭하고 세밀한 개선은 다음과 같습니다<li ng-if="!filteredItems.length">
Matty J

대단하다. 나는 예전처럼 많이 dirtyer 방법을 사용하고있다item in (filteredItems = (items | filter: someFilter))
Firze

6

JavaScript / AngularJS 대신 CSS를 사용하는 다른 방법이 있습니다.

CSS :

.emptymsg {
  display: list-item;
}

li + .emptymsg {
  display: none;
}

마크 업 :

<ul>
    <li ng-repeat="item in filteredItems"> ... </li>
    <li class="emptymsg">No items found</li>
</ul>

목록이 비어 있으면 <li ng-repeat = "item in filtersItems"> 등이 주석 처리되고 li 요소 대신 주석이됩니다.


질문에 "목록이있는 곳에 메시지 상자를 갖고 싶습니다"라고 말합니다. 또한 로직을 스타일 시트로 분리하는 것이 불리하다고 생각합니다. 유지 보수가 어렵고 문제를 요구하기가 어렵습니다.
Prinzhorn

1
@ Prinzhorn, 논리가 매우 간단하고 유지 관리가 쉽고 CSS가 다른 목록에 재사용 가능하며 JavaScript에 의존하지 않기 때문에 CSS를 사용하는 것이 유리하다고 생각합니다. 추가 청취자 또는 감시자가 필요하지 않습니다. 메시지는 상자처럼 보이도록 스타일을 지정할 수 있었지만 답을 단순하게 유지하지는 않았습니다.
Miriam Salzer

몇 달 늦었지만 당연한 일이지만 Miriam에 동의합니다.이 답변은 천재적이라고 생각합니다.
Jon Combe

2

이 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>

1

as키워드를 사용 하여 ng-repeat요소 아래에서 컬렉션을 참조 할 수 있습니다 .

<table>
    <tr ng-repeat="task in tasks | filter:category | filter:query as res">
        <td>{{task.id}}</td>
        <td>{{task.description}}</td>
    </tr>
    <tr ng-if="res.length === 0">
        <td colspan="2">no results</td>
    </tr>
</table>

0

나는 보통 ng-show를 사용한다

<li ng-show="variable.length"></li>

예를 들어 변수를 정의하는 곳

<div class="list-group-item" ng-repeat="product in store.products">
   <li ng-show="product.length">show something</li>
</div>

0

이것이 html 페이지에서 렌더링되지 않고 html 태그를 검사에서 볼 수 없기 때문에 ng-if를 사용할 수 있습니다 ...

<ul ng-repeat="item in items" ng-if="items.length > 0">
    <li>{{item}}<li>
</ul>
<div class="alert alert-info">there is no items!</div>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.