万恶的申先生 發表於 2021-11-2 23:32:00

angular--ng-template&ngTemplateOutlet的用法

<h2>&nbsp;1.ng-template指令介绍--&lt;ng-template&gt;&lt;/ng-template&gt;</h2>
<p>&nbsp;ng-template表示一个模板,标签内是模板的内容,模板的内容可以与其它模板一起组成组件模板。</p>
<p>在Angular中,我们用过的许多结构指令都使用了ng-template,如ngIf、ngFor和ngSwitch。</p>
<p>ngTemplate中的内容可以自定义,并且一开始不会被渲染,<span style="text-decoration: line-through">除非满足一定的条件</span>。我们必须使用结构指令去渲染它。</p>
<div class="cnblogs_code">
<div>
<div>&lt;ng-template&gt;</div>
<div>&nbsp; &nbsp; &lt;button class="tab-button" (click)="login()"&gt;{{loginText}}&lt;/button&gt;</div>
<div>&nbsp; &nbsp; &lt;button class="tab-button" (click)="signUp()"&gt;{{signUpText}}&lt;/button&gt;</div>
<div>&lt;/ng-template&gt;</div>
</div>
</div>
<p>上面代码在页面中并没有被渲染。</p>
<h2>2.ng-template使用</h2>
<h3>2.1ng-template与ngIf</h3>
<p>我们见的最多的可能是与ngIf一块使用,当if条件不成立时,将显示else中的内容。下面代码中else语句被指向了一个名为loading的模板,通过模板引用#loading的方式。</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> &lt;div class="lessons-list" *ngIf="lessons else loading"&gt;
<span style="color: rgba(0, 128, 128, 1)">2</span> <span style="color: rgba(0, 0, 0, 1)">...
</span><span style="color: rgba(0, 128, 128, 1)">3</span> &lt;/div&gt;
<span style="color: rgba(0, 128, 128, 1)">4</span>
<span style="color: rgba(0, 128, 128, 1)">5</span> &lt;ng-template #loading&gt;
<span style="color: rgba(0, 128, 128, 1)">6</span>   &lt;div&gt;Loading...&lt;/div&gt;
<span style="color: rgba(0, 128, 128, 1)">7</span> &lt;/ng-template&gt;</pre>
</div>
<p>其实,ngIf指令也是ng-template的包装。</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> &lt;ng-template ="lessons" ="loading"&gt;
<span style="color: rgba(0, 128, 128, 1)">2</span>    &lt;div class="lessons-list"&gt;
<span style="color: rgba(0, 128, 128, 1)">3</span> <span style="color: rgba(0, 0, 0, 1)">   ...
</span><span style="color: rgba(0, 128, 128, 1)">4</span>    &lt;/div&gt;
<span style="color: rgba(0, 128, 128, 1)">5</span> &lt;/ng-template&gt;
<span style="color: rgba(0, 128, 128, 1)">6</span>
<span style="color: rgba(0, 128, 128, 1)">7</span> &lt;ng-template #loading&gt;
<span style="color: rgba(0, 128, 128, 1)">8</span>   &lt;div&gt;Loading...&lt;/div&gt;
<span style="color: rgba(0, 128, 128, 1)">9</span> &lt;/ng-template&gt;</pre>
</div>
<p>和为模板输入变量。</p>
<h3>2.2同一元素使用多个结构指令</h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> &lt;div class="lesson" *ngIf="lessons"
<span style="color: rgba(0, 128, 128, 1)">2</span>      *ngFor="let lesson of lessons"&gt;
<span style="color: rgba(0, 128, 128, 1)">3</span>   &lt;div class="lesson-detail"&gt;
<span style="color: rgba(0, 128, 128, 1)">4</span>         {{lesson |<span style="color: rgba(0, 0, 0, 1)"> json}}
</span><span style="color: rgba(0, 128, 128, 1)">5</span>   &lt;/div&gt;
<span style="color: rgba(0, 128, 128, 1)">6</span> &lt;/div&gt;</pre>
</div>
<p>这样会报错:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">Uncaught Error: Template parse errors:
Can</span>'<span style="color: rgba(0, 0, 0, 1)">t have multiple template bindings on one element. Use only one attribute
named </span>'template' or prefixed with *</pre>
</div>
<p>这意味着不能在同一个元素使用两个或多个结构指令。</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> &lt;div *ngIf="lessons"&gt;
<span style="color: rgba(0, 128, 128, 1)">2</span>   &lt;div class="lesson" *ngFor="let lesson of lessons"&gt;
<span style="color: rgba(0, 128, 128, 1)">3</span>         &lt;div class="lesson-detail"&gt;
<span style="color: rgba(0, 128, 128, 1)">4</span>             {{lesson |<span style="color: rgba(0, 0, 0, 1)"> json}}
</span><span style="color: rgba(0, 128, 128, 1)">5</span>         &lt;/div&gt;
<span style="color: rgba(0, 128, 128, 1)">6</span>   &lt;/div&gt;
<span style="color: rgba(0, 128, 128, 1)">7</span> &lt;/div&gt;</pre>
</div>
<p>可以在ngFor指令的外面包一层ngIf指令,这样就解决了上面的问题;但这样会额外创一个一个元素。因此,我们可以使用ng-container指令。</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> &lt;ng-container *ngIf="lessons"&gt;
<span style="color: rgba(0, 128, 128, 1)">2</span>   &lt;div class="lesson" *ngFor="let lesson of lessons"&gt;
<span style="color: rgba(0, 128, 128, 1)">3</span>         &lt;div class="lesson-detail"&gt;
<span style="color: rgba(0, 128, 128, 1)">4</span>             {{lesson |<span style="color: rgba(0, 0, 0, 1)"> json}}
</span><span style="color: rgba(0, 128, 128, 1)">5</span>         &lt;/div&gt;
<span style="color: rgba(0, 128, 128, 1)">6</span>   &lt;/div&gt;
<span style="color: rgba(0, 128, 128, 1)">7</span> &lt;/ng-container&gt;</pre>
</div>
<p>ng-container的一种用途是,给我们提供一个附加指令的元素而不会创建一个额外的元素。另一种用途是,配合ngTemplateOutlet使用。</p>
<h2>3.ngTemplateOutlet使用介绍</h2>
<p>ngTemplateOutlet也是一个指令,它使用模板引用和上下文对象作为参数动态实例化模板。作为一个结构指令,我们可以使用它在DOM的各个部分插入模板(由ng-template创建)。</p>
<p>&nbsp;<span class="cnblogs_code"><span style="color: rgba(0, 128, 128, 1)">1</span> &lt;ng-container *ngTemplateOutlet="loading"&gt;<span class="crayon-r">This<span class="crayon-h"> <span class="crayon-e">text <span class="crayon-st">is<span class="crayon-h"> <span class="crayon-e">not <span class="crayon-i">displayed</span></span></span></span></span></span></span>&lt;/ng-container&gt;</span>&nbsp;</p>
<p>ngTemplateOutlet包含的任何内部内容都不会被渲染;我们可以根据需要向页面添加任意数量的ngTemplateOutlet标签,并实例化许多不同的模板。</p>
<p>&nbsp;<span class="cnblogs_code"><span style="color: rgba(0, 128, 128, 1)">1</span> &lt;div *ngTemplateOutlet="loading"&gt;&lt;/div&gt; </span>&nbsp;</p>
<p>上面代码中的div并不会被渲染,因为angular将上述内容替换成ng-template语法,</p>
<p>&nbsp;<span class="cnblogs_code"><span style="color: rgba(0, 128, 128, 1)">1</span> &lt;ng-template ="template1"&gt;&lt;div&gt;&lt;/div&gt;&lt;/ng-template&gt;</span>&nbsp;</p>
<h3>3.1传递数据给ngTemplateOutlet</h3>
<p>我们可以通过ngTemplateOutletContext属性传递数据</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> &lt;ng-template let-value="value" #messageTemplate&gt;
<span style="color: rgba(0, 128, 128, 1)">2</span>   &lt;p&gt;Value Received from the Parent is{{value}}&lt;/p&gt;
<span style="color: rgba(0, 128, 128, 1)">3</span> &lt;/ng-template&gt;</pre>
</div>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> &lt;ng-container ="messageTemplate"
<span style="color: rgba(0, 128, 128, 1)">2</span>       ="{value:'1000'}"&gt;
<span style="color: rgba(0, 128, 128, 1)">3</span> &lt;/ng-container&gt; </pre>
</div>
<p>当然,也可以使用简写属性--context:</p>
<p>&nbsp;<span class="cnblogs_code"><span style="color: rgba(0, 128, 128, 1)">1</span> &lt;ng-container *ngTemplateOutlet="messageTemplate; context:{value:100}"&gt;&lt;/ng-container&gt; </span>&nbsp;传递多个数据:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> &lt;ng-template let-name="nameVar" let-message="messageVar" #template&gt;
<span style="color: rgba(0, 128, 128, 1)">2</span>   &lt;p&gt;Dear {{name}} , {{message}} &lt;/p&gt;
<span style="color: rgba(0, 128, 128, 1)">3</span> &lt;/ng-template&gt;
<span style="color: rgba(0, 128, 128, 1)">4</span>
<span style="color: rgba(0, 128, 128, 1)">5</span>
<span style="color: rgba(0, 128, 128, 1)">6</span> &lt;ng-container ="template"
<span style="color: rgba(0, 128, 128, 1)">7</span>          ="{nameVar:'Guest',messageVar:'Welcome to our site'}"&gt;
<span style="color: rgba(0, 128, 128, 1)">8</span> &lt;/ng-container&gt; </pre>
</div>
<p>传递对象:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span>
<span style="color: rgba(0, 128, 128, 1)">2</span> &lt;ng-template let-person="person"#template&gt;
<span style="color: rgba(0, 128, 128, 1)">3</span>   &lt;p&gt;Dear {{person.name}} , {{person.message}} &lt;/p&gt;
<span style="color: rgba(0, 128, 128, 1)">4</span> &lt;/ng-template&gt;
<span style="color: rgba(0, 128, 128, 1)">5</span>
<span style="color: rgba(0, 128, 128, 1)">6</span>
<span style="color: rgba(0, 128, 128, 1)">7</span> &lt;ng-container ="template"
<span style="color: rgba(0, 128, 128, 1)">8</span>             ="{ person:{name:'Guest',message:'Welcome to our site'} }"&gt;
<span style="color: rgba(0, 128, 128, 1)">9</span> &lt;/ng-container&gt; </pre>
</div>
<p>使用$implicit:</p>
<p>可以在上下文对象中使用$implicit将其值设置为所有局部变量的默认值。</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> &lt;ng-template let-name let-message="message" #template3&gt;
<span style="color: rgba(0, 128, 128, 1)">2</span>   &lt;p&gt;Dear {{name}} , {{message}} &lt;/p&gt;
<span style="color: rgba(0, 128, 128, 1)">3</span> &lt;/ng-template&gt;
<span style="color: rgba(0, 128, 128, 1)">4</span>
<span style="color: rgba(0, 128, 128, 1)">5</span> &lt;ng-container ="templates"
<span style="color: rgba(0, 128, 128, 1)">6</span>                ="{$implicit:'Guest',message:'Welcome to our site'}"&gt;
<span style="color: rgba(0, 128, 128, 1)">7</span> &lt;/ng-container&gt; </pre>
</div>
<p>上面代码中,我们没有给 let-name 赋值,因此它从$implicit中获取值。</p>
<h3>3.2模板上下文</h3>
<p>每个模板可以定义自己的输入变量;实际上,每个模板都关联了一个上下文对象,其中包含所有特定于模板的输入变量。<span style="color: rgba(0, 128, 128, 1)"><br></span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(0, 0, 0, 1)">@Component({
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span>   selector: 'app-root'<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 3</span> <span style="color: rgba(0, 0, 0, 1)">template: `      
</span><span style="color: rgba(0, 128, 128, 1)"> 4</span> &lt;ng-template #estimateTemplate let-lessonsCounter="estimate"&gt;
<span style="color: rgba(0, 128, 128, 1)"> 5</span>   &lt;div&gt; Approximately {{lessonsCounter}} lessons ...&lt;/div&gt;
<span style="color: rgba(0, 128, 128, 1)"> 6</span> &lt;/ng-template&gt;
<span style="color: rgba(0, 128, 128, 1)"> 7</span> &lt;ng-<span style="color: rgba(0, 0, 0, 1)">container
</span><span style="color: rgba(0, 128, 128, 1)"> 8</span>    *ngTemplateOutlet="estimateTemplate;context:ctx"&gt;
<span style="color: rgba(0, 128, 128, 1)"> 9</span> &lt;/ng-container&gt;
<span style="color: rgba(0, 128, 128, 1)">10</span> <span style="color: rgba(0, 0, 0, 1)">`})
</span><span style="color: rgba(0, 128, 128, 1)">11</span> <span style="color: rgba(0, 0, 0, 1)">export class AppComponent {
</span><span style="color: rgba(0, 128, 128, 1)">12</span>
<span style="color: rgba(0, 128, 128, 1)">13</span>   totalEstimate = 10<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">14</span>   ctx = {estimate: <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.totalEstimate};
</span><span style="color: rgba(0, 128, 128, 1)">15</span>   
<span style="color: rgba(0, 128, 128, 1)">16</span> }</pre>
</div>
<p>说明:lessonsCounter为输入变量,通过ng-template属性使用前缀 let- 定义的</p>
<p>lessonsCounter对ng-template模板里面的内容是可见的,对模板外是不可见的。</p>
<p>lessonsCounter的值是由 estimate 决定的,故context 对象必须有一个estimate 的属性。</p>
<h3>3.3 模板引用</h3>
<p>我们可以使用ViewChild装饰器将模板直接注入到组件中:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(0, 0, 0, 1)">@Component({
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span>   selector: 'app-root'<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 3</span> <span style="color: rgba(0, 0, 0, 1)">template: `      
</span><span style="color: rgba(0, 128, 128, 1)"> 4</span>       &lt;ng-template #defaultTabButtons&gt;
<span style="color: rgba(0, 128, 128, 1)"> 5</span>         &lt;button class="tab-button" (click)="login()"&gt;
<span style="color: rgba(0, 128, 128, 1)"> 6</span> <span style="color: rgba(0, 0, 0, 1)">            {{loginText}}
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span>         &lt;/button&gt;
<span style="color: rgba(0, 128, 128, 1)"> 8</span>         &lt;button class="tab-button" (click)="signUp()"&gt;
<span style="color: rgba(0, 128, 128, 1)"> 9</span> <span style="color: rgba(0, 0, 0, 1)">            {{signUpText}}
</span><span style="color: rgba(0, 128, 128, 1)">10</span>         &lt;/button&gt;
<span style="color: rgba(0, 128, 128, 1)">11</span>       &lt;/ng-template&gt;
<span style="color: rgba(0, 128, 128, 1)">12</span> <span style="color: rgba(0, 0, 0, 1)">`})
</span><span style="color: rgba(0, 128, 128, 1)">13</span> <span style="color: rgba(0, 0, 0, 1)">export class AppComponent implements OnInit {
</span><span style="color: rgba(0, 128, 128, 1)">14</span>
<span style="color: rgba(0, 128, 128, 1)">15</span>   @ViewChild('defaultTabButtons'<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">16</span>   private defaultTabButtonsTpl: TemplateRef&lt;any&gt;<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">17</span>
<span style="color: rgba(0, 128, 128, 1)">18</span> <span style="color: rgba(0, 0, 0, 1)">    ngOnInit() {
</span><span style="color: rgba(0, 128, 128, 1)">19</span>         console.log(<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.defaultTabButtonsTpl); //undefined; ngAfterViewInit()才会打印
</span><span style="color: rgba(0, 128, 128, 1)">20</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)">21</span>
<span style="color: rgba(0, 128, 128, 1)">22</span> }</pre>
</div>
<p>模板可以被注入,就像DOM元素和组件一样,通过将模板引用传给ViewChild装饰器。</p>
<p>我们还可以将模板作为一个输入变量:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(0, 0, 0, 1)">@Component({
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span>   selector: 'app-root'<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 3</span> <span style="color: rgba(0, 0, 0, 1)">template: `      
</span><span style="color: rgba(0, 128, 128, 1)"> 4</span> &lt;ng-template #customTabButtons&gt;
<span style="color: rgba(0, 128, 128, 1)"> 5</span>   &lt;div class="custom-class"&gt;
<span style="color: rgba(0, 128, 128, 1)"> 6</span>         &lt;button class="tab-button" (click)="login()"&gt;
<span style="color: rgba(0, 128, 128, 1)"> 7</span> <span style="color: rgba(0, 0, 0, 1)">          {{loginText}}
</span><span style="color: rgba(0, 128, 128, 1)"> 8</span>         &lt;/button&gt;
<span style="color: rgba(0, 128, 128, 1)"> 9</span>         &lt;button class="tab-button" (click)="signUp()"&gt;
<span style="color: rgba(0, 128, 128, 1)">10</span> <span style="color: rgba(0, 0, 0, 1)">          {{signUpText}}
</span><span style="color: rgba(0, 128, 128, 1)">11</span>         &lt;/button&gt;
<span style="color: rgba(0, 128, 128, 1)">12</span>   &lt;/div&gt;
<span style="color: rgba(0, 128, 128, 1)">13</span> &lt;/ng-template&gt;
<span style="color: rgba(0, 128, 128, 1)">14</span> &lt;tab-container ="customTabButtons"&gt;&lt;/tab-container&gt;      
<span style="color: rgba(0, 128, 128, 1)">15</span> <span style="color: rgba(0, 0, 0, 1)">`})
</span><span style="color: rgba(0, 128, 128, 1)">16</span> <span style="color: rgba(0, 0, 0, 1)">export class AppComponent implements OnInit {
</span><span style="color: rgba(0, 128, 128, 1)">17</span>
<span style="color: rgba(0, 128, 128, 1)">18</span> }</pre>
</div>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(0, 0, 0, 1)">@Component({
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span>   selector: 'tab-container'<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 3</span> <span style="color: rgba(0, 0, 0, 1)">    template: `
</span><span style="color: rgba(0, 128, 128, 1)"> 4</span>   
<span style="color: rgba(0, 128, 128, 1)"> 5</span> &lt;ng-template #defaultTabButtons&gt;
<span style="color: rgba(0, 128, 128, 1)"> 6</span>   
<span style="color: rgba(0, 128, 128, 1)"> 7</span>   &lt;div class="default-tab-buttons"&gt;
<span style="color: rgba(0, 128, 128, 1)"> 8</span> <span style="color: rgba(0, 0, 0, 1)">      ...
</span><span style="color: rgba(0, 128, 128, 1)"> 9</span>   &lt;/div&gt;
<span style="color: rgba(0, 128, 128, 1)">10</span>   
<span style="color: rgba(0, 128, 128, 1)">11</span> &lt;/ng-template&gt;
<span style="color: rgba(0, 128, 128, 1)">12</span> &lt;ng-<span style="color: rgba(0, 0, 0, 1)">container
</span><span style="color: rgba(0, 128, 128, 1)">13</span>   *ngTemplateOutlet="headerTemplate ? headerTemplate: defaultTabButtons"&gt;
<span style="color: rgba(0, 128, 128, 1)">14</span>   
<span style="color: rgba(0, 128, 128, 1)">15</span> &lt;/ng-container&gt;
<span style="color: rgba(0, 128, 128, 1)">16</span> <span style="color: rgba(0, 0, 0, 1)">... rest of tab container component ...
</span><span style="color: rgba(0, 128, 128, 1)">17</span> <span style="color: rgba(0, 0, 0, 1)">`})
</span><span style="color: rgba(0, 128, 128, 1)">18</span> <span style="color: rgba(0, 0, 0, 1)">export class TabContainerComponent {
</span><span style="color: rgba(0, 128, 128, 1)">19</span> <span style="color: rgba(0, 0, 0, 1)">    @Input()
</span><span style="color: rgba(0, 128, 128, 1)">20</span>   headerTemplate: TemplateRef&lt;any&gt;<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">21</span> }</pre>
</div>
<p>当我们传入自定义模板时(#customTabButtons),就显示这个自定义模板;否则,显示默认的模板。</p>
<h3>3.4 ngTemplateOutlet、ng-template 与内容投影</h3>
<p>父组件使用内容投影传递一个模板给子组件:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> import { Component, TemplateRef, Input, OnInit, ViewChild, AfterViewInit } from '@angular/core'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span>
<span style="color: rgba(0, 128, 128, 1)"> 3</span> <span style="color: rgba(0, 0, 0, 1)">@Component({
</span><span style="color: rgba(0, 128, 128, 1)"> 4</span>   selector: 'parent1'<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 5</span> <span style="color: rgba(0, 0, 0, 1)">template: `
</span><span style="color: rgba(0, 128, 128, 1)"> 6</span>   
<span style="color: rgba(0, 128, 128, 1)"> 7</span>   &lt;h1&gt;Parent Component &lt;/h1&gt;
<span style="color: rgba(0, 128, 128, 1)"> 8</span>
<span style="color: rgba(0, 128, 128, 1)"> 9</span>   &lt;child1&gt;
<span style="color: rgba(0, 128, 128, 1)">10</span>   &lt;p&gt;This Template is Projected to the Child&lt;/p&gt;
<span style="color: rgba(0, 128, 128, 1)">11</span>   &lt;/child1&gt;
<span style="color: rgba(0, 128, 128, 1)">12</span> <span style="color: rgba(0, 0, 0, 1)">`
</span><span style="color: rgba(0, 128, 128, 1)">13</span> <span style="color: rgba(0, 0, 0, 1)">})
</span><span style="color: rgba(0, 128, 128, 1)">14</span> <span style="color: rgba(0, 0, 0, 1)">export class Parent1Component {
</span><span style="color: rgba(0, 128, 128, 1)">15</span> }</pre>
</div>
<p>子组件:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> import { Component, TemplateRef, Input, OnInit, ViewChild, AfterViewInit } from '@angular/core'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span>
<span style="color: rgba(0, 128, 128, 1)"> 3</span> <span style="color: rgba(0, 0, 0, 1)">@Component({
</span><span style="color: rgba(0, 128, 128, 1)"> 4</span>   selector: 'child1'<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 5</span> <span style="color: rgba(0, 0, 0, 1)">template: `
</span><span style="color: rgba(0, 128, 128, 1)"> 6</span>
<span style="color: rgba(0, 128, 128, 1)"> 7</span>   &lt;h1&gt;Child Component &lt;/h1&gt;
<span style="color: rgba(0, 128, 128, 1)"> 8</span>
<span style="color: rgba(0, 128, 128, 1)"> 9</span>   &lt;ng-template #parentTemplate&gt;
<span style="color: rgba(0, 128, 128, 1)">10</span>   &lt;ng-content&gt;&lt;/ng-content&gt;
<span style="color: rgba(0, 128, 128, 1)">11</span>   &lt;/ng-template&gt;
<span style="color: rgba(0, 128, 128, 1)">12</span>
<span style="color: rgba(0, 128, 128, 1)">13</span>   &lt;ng-template ="parentTemplate"&gt;&lt;/ng-template&gt;
<span style="color: rgba(0, 128, 128, 1)">14</span>
<span style="color: rgba(0, 128, 128, 1)">15</span> <span style="color: rgba(0, 0, 0, 1)">`
</span><span style="color: rgba(0, 128, 128, 1)">16</span> <span style="color: rgba(0, 0, 0, 1)">})
</span><span style="color: rgba(0, 128, 128, 1)">17</span> <span style="color: rgba(0, 0, 0, 1)">export class Child1Component {
</span><span style="color: rgba(0, 128, 128, 1)">18</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">19</span></pre>
</div>
<h2>4.总结</h2>
<p>ng-template、ng-container和ngTemplateOutlet指令结合使用,可以创建高度动态和可定制的组件。</p>
<p>&nbsp;</p>
<div id="gtx-trans" style="position: absolute; left: -18px; top: 4641.3px">&nbsp;</div><br><br>
来源:https://www.cnblogs.com/sparkler/p/15490689.html
頁: [1]
查看完整版本: angular--ng-template&ngTemplateOutlet的用法