美文网首页
05Angular结构型指令

05Angular结构型指令

作者: learninginto | 来源:发表于2020-10-15 21:21 被阅读0次
ngFor
<ul class="title-con">
  <li *ngFor="let menu of menus;let odd = odd; let even = even">
    <a href="#">{{menu.title}}</a>
  </li>
</ul>
  1. 变量的应用范围
  2. 索引的获取
  3. 第一个和最后一个(let menu of menus; let first = first; let last = last)
  4. 奇和偶(下标的索引)
  • 提升性能

(let menu of menus; trackBy:trackElement)接一个函数或者表达式,所以说,在经常变动的列表中通常都加上trackBy

trackElement(menus:Menus):string{
    return menus.id;
}
  • 完整写法
<ul class="list">
    <ng-template ngFor [ngForOf]="hero" let-item let-i="index"
    let-len="count" let-ev="even" let-od="odd" let-f="first" let-l="last" [ngForTrackBy]="trackByHero">
    <li [class.even]="ev" [class.odd]="od">
    </li>
    </ng-template>
</ul>
  • ng-template

是一个Angular元素,用来渲染HTML。它永远不会直接显示出来。事实上,在渲染视图之前,Angualar会把ng-template及其内容替换为一个注释,可以使用ng-If将其显示。

它不是一个指令、组件、类或接口,更像是JS中if块中的花括号

<ng-template [ngIf]="true">
    <!--不可见-->
    <p>Mid!</p>
</ng-template>
  • ng-container

同样不会影响DOM结构,默认就是显示的,不需要配合结构型指令

<p>
    这是一行文字
    <ng-container *ngIf="false">我想在不增加标签的前提下,让这行文字不显示</ng-container>
    这是一行文字
</p>
ngIf
<div *ngIf="条件表达式">
在条件为真的时候需要显示的内容
</div>
  • 使用别名
<p *ngIf="show as s">test -- {{s}}</p>
  • 上面的完整写法
<ng-template [ngIf]="show" let-s>
    <p>test ngIf alias -- {{s}}</p>
</ng-template>
  • 配合else使用
<div *ngIf="条件表达式" else elseContent>
在条件为真的时候需要显示的内容
</div>
<ng-template #elseContent>
在条件为假时显示的内容
</ng-template>
//这里的ng-template就是一段内置的模板,可以放html或自己的组件
  • 其实*ngIf就是一个语法糖,把它拆解一下
<button (click)="show=!show">显示/隐藏</button>
<ng-template [ngIf]="show" [ngIfElse]="elseShow">
    <p>
      拆解*ngIf
    </p>
</ng-template>
<ng-template #elseShow>
    <p>
      ngIf为假时显示
    </p>
</ng-template>

还可以解锁更多没啥用的语法:ngIfthen

ngSwitch
  • 常规写法
<div class="conent" [ngSwitch]="fruit">
    <p *ngSwitchCase="'apple'">苹果</p>
    <p *ngSwitchCase="'pear'">梨</p>
    <p *ngSwitchCase="'grape'">葡萄</p>
    <p *ngSwitchDefault>啥都不是</p>
</div>
  • 展开写法
<div class="conent" [ngSwitch]="fruit">
    <ng-template ngSwitchCase="apple">
        <p>苹果</p>
    </ng-template>
    <ng-template *ngSwitchCase="'pear'">
        <p>梨</p>
    </ng-template>
    <ng-template *ngSwitchCase="'grape'">
        <p>葡萄</p> 
    </ng-template>
    <ng-template *ngSwitchDefault>
        <p>啥都不是</p>
    </ng-template>
</div>
自定义结构型指令
  • 创建自定义指令
ng g d directives/unless 
  • 创建一个内嵌的视图,并把这个视图插入到一个视图容器中

  • 使用TemplateRef取得<ng-template>的内容,并通过ViewContainerRef来访问这个视图容器

  • 简单地实现一个ngIf指令

export class UnlessContet<T = unkown>{
    $implicit: T = null;
    appUnless: T = null;
    attr: T = null;
}
@Directive({
    selector:'[appUnless]'
})
export class UnlessDirective{
    private hasView = false;
    private context = new UnlessContext();
    @Input()
    set appUnless(condition:boolean){
        this.context.$implicit = this.context.appUnless = condition;
        this.context.attr = 'aaaa';
        if(!condition && !this.hasView){
            this.viewContainer.createEmbeddedView(this.tempateRef,this.context);
            this.hasView = true;
        }else if(condition && this.hasView){
            this.viewContainer.clear();
            this.hasView = false;
        }
    }
    constructor(private templateRef:TemplateRef<any>,private viewContainer:ViewContainerRef){
        console.log('appUnless')
    }
}

  • html
<button class="btn btn-primary" (click)="showUnless = !showUnless">
    toggle unless
</button>
<p *appUnless="showUnless"> 测试unless directive --{{showUnless}} </p>
<p *appUnless="showUnless as un">测试unless directive --{{un}}</p>
<p *appUnless="showUnless;let un;let attr=attr;">测试unless directive --{{un}}attr{{attr}}</p>

加了星号之后,构造函数内部的templateRef会去自动创建一个ng-template

  • 展开写法
<ng-template [appUnless]="showUnless" let-at="attr" let-un>
    <p>测试unless directive --{{un}} attr {{at}}</p>
</ng-template>

相关文章

  • 05Angular结构型指令

    ngFor 变量的应用范围索引的获取第一个和最后一个(let menu of menus; let first =...

  • 04Angular属性型指令

    指令的分类 组件(带模板的指令)结构型指令(改变宿主文档结构)属性型指令(改变宿主行为) 内置指令 结构型指令(改...

  • Angular2.x 指令

    1. 指令: 在 Angular 中有三种类型的指令:组件 — 拥有模板的指令。 结构型指令 — 通过添加和移除 ...

  • Angular 知识点记录二

    9. 指令概览 在 Angular 中有三种类型的指令: 组件 — 拥有模板的指令 结构型指令 — 通过添加和移除...

  • 指令

    分类 组件:带有模版的指令 属性型指令:更改元素、组件或其他指令的外观或行为的指令。 结构型指令:通过添加和删除 ...

  • Ionic3 自定义指令

    在 Angular 中有三种类型的指令 组件 — 拥有模板的指令 结构型指令 — 通过添加和移除 DOM 元素改变...

  • 2019-04-24

    结构型指令和属性型指令。 Angular 本身定义了一系列这两种类型的指令,你也可以使用 @Directive()...

  • angular 学习笔记 -- 指令

    指令分三类:1.自定义型指令 如:组件2.结构型指令操作的是dom整体,例如:*ng-for , *ng-if等等...

  • Angular自定义指令

    我们知道angular指令分为结构型和属性型2种,今天就来研究一下自定义属性型指令。 上面我们定义了一个指令,如何...

  • 设计模式之六——适配器模式

    原文传送门 1 介绍 适配器模式既可以作为类结构型模式,也可以作为对象结构型模式。结构型模式描述如何将类或者对象结...

网友评论

      本文标题:05Angular结构型指令

      本文链接:https://www.haomeiwen.com/subject/aezopktx.html