Devlog/Web

[Angular] error NG5002: Can't have multiple template bindings on one element. Use only one attribute prefixed with *

Damien.Lee 2020. 12. 8. 19:11
반응형
 

문제점

사용자의 이름과 연락처가 적힌 데이터를 받아 온 후, 화면에 목록을 표시하는 작업을 하고자합니다.

사용자 목록을 표기하기 위해 ngFor를 사용하고, 사용자 정보가 하나도 없을경우엔 테이블이 완전 보이지 않도록 ngif로 처리하고자 다음과 같이 코드를 작성하였습니다.

<div *ngIf="hasUser" *ngFor="let user of userlist">
  <li>{{user.name}} / {{user.phone}}</li>
</div>

 

그 뒤 컴파일을 진행하면, 아래와 같은 에러가 발생합니다.

error NG5002: Can't have multiple template bindings on one element. Use only one attribute prefixed with *

 

구조적 지시문 ( structural directives ) 에 해당하는 ngIf , ngFor 와 같은 녀석들은 DOM을 직접 조작하여 추가 및 변경하는 기능들을 수행합니다.

이 둘을 같은 Elements 에서 사용하게 되면, 몇가지 문제가 발생하게 됩니다.

일단 호출순서를 제어할 수 있는 방법이 없기에, 둘 중 무엇이 먼저 호출되냐에 따라 의도치 않은 동작이 구현될 수 있습니다.

 

자 그럼, 하나의 빈 div를 만들어서 부모로 감싸서 쓰면되지 않느냐?

<div *ngIf="hasUser">
  <div *ngFor="let user of userlist">
    <li>{{user.name}} / {{user.phone}}</li>
  </div>
</div>

단순히 '하나의 Element엔 하나의 지시문 (directives)만 쓰면 된다' 는 식으로 했을때 위와 같이 작성하는 것은 동작 자체엔 큰 문제가 없습니다.

다만, ngif 가 비어있는 div의 지시문으로 구성되면서 Angular 내부적으로 비어있는 div을 추가적으로 생성하여 불필요한 DOM Depth 구조를 형성하게 됩니다.

div 로 부모를 생성한 (좌) / ng-container로 부모를 생성한 (우) - 불필요한 div 가 Elements를 감싸지 않는다.

이 때, ngif가 있고,그 외 별다른 역할을 하지 않는 최상단 Elements 에 div 대신 ng-container 를 적용하게 되면, 불필요하게 감싸고 있는 div 생성을 막을 수 있습니다.

 

참고자료

 - Angular 공식문서 : 속성 지시문

 - Angular 공식문서 : 구조적 지시문

반응형