<ng- 컨테이너> vs <서식 파일>


150

ng-container Angular 2 설명서에 언급되어 있지만 작동 방식과 사용 사례에 대한 설명은 없습니다.

그것은 특히에서 언급 ngPlural하고 ngSwitch지시.

<ng-container>와 같은 작업을 수행 합니까 <template>, 또는 명령 중 하나를 사용하도록 지시문을 작성했는지 여부에 따라 다릅니다.

아르

<ng-container *ngPluralCase="'=0'">there is nothing</ng-container>

<template [ngPluralCase]="'=0'">there is nothing</template>

동일해야합니까?

우리는 그들 중 하나를 어떻게 선택합니까?

<ng-container>사용자 지정 지시문에 어떻게 사용할 수 있습니까?

답변:


244

편집 : 이제 문서화되었습니다.

<ng-container> 구조에

Angular  <ng-container> 는 스타일이나 레이아웃을 방해하지 않는 그룹화 요소로, Angular는 DOM에 넣지 않기 때문에 스타일이나 레이아웃을 방해하지 않습니다.

(...)

는  <ng-container> 각 파서 인식 신택스 요소이다. 지시어, 구성 요소, 클래스 또는 인터페이스가 아닙니다. JavaScript if-block의 중괄호와 비슷합니다.

  if (someCondition) {
      statement1; 
      statement2;
      statement3;
     }

이러한 중괄호가 없으면 JavaScript는 모든 명령문을 단일 블록으로 조건부로 실행하려는 경우에만 첫 번째 명령문을 실행합니다. <ng-container> 만족 각도 템플릿에서 유사한 필요.

원래 답변 :

이 풀 요청 에 따르면 :

<ng-container> 노드를 그룹화하는 데 사용할 수 있지만 DOM 트리에서 노드로 렌더링되지 않는 논리 컨테이너입니다.

<ng-container> HTML 주석으로 렌더링됩니다.

따라서이 각도 템플릿 :

<div>
    <ng-container>foo</ng-container>
<div>

이런 종류의 출력을 생성합니다.

<div>
    <!--template bindings={}-->foo
<div>

따라서 응용 프로그램에서 ng-container요소 그룹을 조건부로 추가 (예 : 사용 *ngIf="foo") 하고 다른 요소로 래핑하지 않으려 는 경우에 유용합니다 .

<div>
    <ng-container *ngIf="true">
        <h2>Title</h2>
        <div>Content</div>
    </ng-container>
</div>

그런 다음 생산합니다 :

<div>
    <h2>Title</h2>
    <div>Content</div>
</div>

그건 좋은 지적이야. <template>지시어없이 사용할 때 와 다른 것으로 생각합니다 . 이 경우에 <template>단지 생성 할 것 <!--template bindings={}-->입니다.
Estus Flask

실제로, <template></template>생성 할 것이다 것은 <script></script> 이 참조
n00dl3

제 경우에는 그렇지 않았습니다. 이 경우에도 <script>컴파일하는 동안, DOM에는 별도의 태그가없는, 이후에 제거됩니다. 설명서에 더 이상 사용되지 않는 정보가 포함되어 있거나 잘못되었다고 생각합니다. 어쨌든 <ng-container>와 <template>의 주요 차이점을 지적 해 주셔서 감사합니다.
Estus Flask

출시 전에 Angular는 렌더링되었습니다 <script></script>. <!--template bindings={}-->꽤 오랫동안 무언가를 렌더링 해 왔습니다 . 문서가 곧 수정 될 것입니다.
Ward

40

설명서 ( https://angular.io/guide/template-syntax#!#star-template )는 다음 예제를 제공합니다. 다음과 같은 템플릿 코드가 있다고 가정 해보십시오.

<hero-detail *ngIf="currentHero" [hero]="currentHero"></hero-detail>

렌더링되기 전에 "설탕 제거"됩니다. 즉, 별표 표기법이 표기법으로 표기됩니다.

<template [ngIf]="currentHero">
  <hero-detail [hero]="currentHero"></hero-detail>
</template>

'currentHero'가 진실 인 경우 다음과 같이 렌더링됩니다.

<hero-detail> [...] </hero-detail>

그러나 다음과 같은 조건부 출력을 원한다면 어떻게해야합니까?

<h1>Title</h1><br>
<p>text</p>

.. 그리고 출력물을 컨테이너에 싸고 싶지 않습니다.

설탕 제거 버전을 다음과 같이 직접 작성할 수 있습니다.

<template [ngIf]="showContent">
  <h1>Title</h1>
  <p>text</p><br>
</template>

그리고 이것은 잘 작동합니다. 그러나 이제 별표 * 대신 대괄호 []가 있어야 ngIf가 필요합니다. https://github.com/angular/angular.io/issues/2303 )

이러한 이유로 다음과 같이 다른 표기법이 작성되었습니다.

<ng-container *ngIf="showContent"><br>
  <h1>Title</h1><br>
  <p>text</p><br>
</ng-container>

두 버전 모두 동일한 결과를 생성합니다 (h1 및 p 태그 만 렌더링 됨). 두 번째는 항상 선호하는 * ngIf를 사용할 수 있기 때문에 선호됩니다.


좋은 설명은, 그것의 개요를 제공 하는 방법 ng-container지시어 생각했다 , 감사합니다 :)
판 카즈 Parkar을

0

Imo 사용 사례 ng-container는 사용자 지정 템플릿 / 구성 요소가 과도하게 사용 되는 간단한 교체입니다. API 문서에서 다음을 언급합니다.

ng-container를 사용하여 여러 루트 노드를 그룹화

그게 전부입니다. 물건 그룹화.

주의하십시오 ng-container지시가 떨어진 대신 지시어는 실제 내용을 랩하는 템플릿으로 떨어진다.


이 언급에 대한 링크가 있습니까? angular.io/docs/ts/latest/api/common/index/… 현재 위의 링크 된 문서 및 복수의 사례 문서에서만 사용되었습니다 .
Koslun


1
고마워, 문서 부족에 관한 문서 사이트에서 문제를 만들고이
Koslun

1
downvoted -1. 컨테이너는 사용자 정의 템플릿을 피하는 것이 아니라 컨테이너에 싸이 지 않은 조건부 내용을 가질 수 있다는 것입니다. 실제로 사용자 정의 템플릿에는 래퍼 컨테이너, 즉 지시문 태그 자체도 도입됩니다.
Carlo Roosen

1
너가 확실히 맞아. 반드시 언급해야 할 차이점입니다. 내 게시물에 힌트를 추가했습니다.
Matt

-1

* ngIf 및 * ngFor와 함께 테이블을 사용하려는 경우 유스 케이스-div를 td / th에 넣으면 테이블 요소가 잘못 작동 합니다. 나는이 문제에 직면했고 대답이었다.


1
그러나 같은 것을 달성 할 수 있습니다 <template [ngIf]...>. 문제는이 두 가지 접근 방식의 차이점이었습니다.
Estus Flask

오, 내 나쁜, 여기에 대답 될 것 같다 stackoverflow.com/questions/40529537/… 그들은 단순히 구문 차이라고 말합니다
shakram02
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.