美文网首页Angular框架专题
Angular框架中的模板语法和常用指令

Angular框架中的模板语法和常用指令

作者: 听书先生 | 来源:发表于2021-11-28 23:13 被阅读0次
  • 模板表达式(属性绑定):
<operator  title="Some Title" ></operator >
等价于
<operator  [title]="'Some Title'" ></operator >
  • 输入属性的值为实例属性:
<operator  [title]="title" ></operator >
等价于
<operator  bind-title="title" ></operator >

// title为外部定义的变量
  • 事件绑定:
<date-picker [dateChanged]="statement()" ></date-picker>
等价于
<date-picker on-dateChanged="statement()" ></date-picker>

  • 双向数据绑定:
<input [ngModel]="obj.name" (ngModelChange)="obj.name=$event"></input>
等价于
<input [(ngModel)]="obj.name" ></input>

  • *与template:

1、*ngIf

<hero-detail *ngIf="currentHero" [hero]="currentHero"></hero-detail>
编译后:
<template [ngIf]="currentHero">
  <hero-detail [hero]="currentHero"></hero-detail>
</template>

2、*ngFor

<hero-detail *ngFor="let hero of heroes; trackBy:trackByHeroes" 
    [hero]="hero">
</hero-detail>
编译后:
<template ngFor let-hero [ngForOf]="heroes" [ngForTrackBy]="trackByHeroes">
  <hero-detail [hero]="hero"></hero-detail>
</template>

3、ngSwitch

有时候需要根据不同的条件,渲染不同的元素,此时我们可以使用多个ngIf来实现,但是这种在随着可选项的增加判断条件就会变得复杂化,angular中我们可以使用ngSwitch指令来解决。

<div class="container" [ngSwitch]="你的选择的属性值">
    <div *ngSwitchCase="'A'">值为A的something</div>
    <div *ngSwitchCase="'B'">值为B的something</div>
    <div *ngSwitchCase="'C'">值为C的something</div>
    <div *ngSwitchDefault>值为其他的something</div>
</div>

4、ngStyle

ngStyle让我们可以更简单的设置DOM元素的CSS属性。
ngStyle支持通过键值对的形式设置DOM元素的样式,background-color需要添加单引号,color不要,因为ngStyle要求参数是js的对象,因为属性必须是一个有效的key。

<div [ngStyle]="{color: '#FFF', 'background-color': '#CCC'}">
   // 内容区域
</div>

//  源码部分
@Directive({selector: '[ngStyle]'})
export class NgStyle implements DoCheck {
  private _ngStyle: {[key: string]: string};
  private _differ: KeyValueDiffer<string, string|number>;

  constructor(
    private _differs: KeyValueDiffers, 
    private _ngEl: ElementRef, 
    private _renderer: Renderer) {}

  @Input()
  set ngStyle(v: {[key: string]: string}) { 
    // <div [ngStyle]="{color: 'white', 'background-color': 'blue'}">
    this._ngStyle = v;
    if (!this._differ && v) {
      this._differ = this._differs.find(v).create();
    }
  }
 
  // 设置元素的样式
  private _setStyle(nameAndUnit: string, value: string|number): void {
    const [name, unit] = nameAndUnit.split('.'); // 截取样式名和单位
    value = value != null && unit ? `${value}${unit}` : value;

    this._renderer.setElementStyle(this._ngEl.nativeElement, name, value as string);
  }
}

5、ngClass

ngClass接收一个对象字面量,对象的key是CSS class的名称,value的值是true/false的值。

.style {
  color: '#FFF',
  background-color: '#000'
}
.font {
  font-size: 20px;
  font-weight: 600;
}

//  是否应用该样式
<div [ngClass]="{style : false}"> 内容部分 </div>
<div [ngClass]="{style : true}"> 内容部分 </div>

// 通过变量判断是否应用该样式
<div [ngClass]="{style : isUse}">
  {{ isUse ? "应用了样式" : "没有应用样式" }}
</div>


// 使用样式的类名数组
<div class="base" [ngClass]="['style', 'font']"> 
  内容区域
</div>


6、ngFor

ngFor指令用来根据数组,创建DOM元素

<div *ngFor="let item of Array;let i = index">
  <div class="item">{{ i+1 }} -- {{ item }}</div>
</div>

在使用ngFor的时候可以使用trackBy提高列表的性能

@Component({
  selector: 'my-app',
  template: `
    <ul>
      <li *ngFor="let item of collection;trackBy: trackByFn">{{item.id}}</li>
    </ul>
  `,
})
export class App {

  constructor() {
    this.collection = [{id: 1}, {id: 2}, {id: 3}];
  }
  
  trackByFn(index, item) {
    return index; // or item.id
  }
}

7、ngNonBindable
ngNonBindable指令主要是用来告诉编译器无需编译页面中的某段特定的代码部分。

<div ngNonBindable>
    // 内容区域
</div>

8、[hidden]属性
hidden属性可以控制元素的可见性,但是该元素使用flex布局的时候就会出现不生效的情况,这种的话就需要使用*ngIf去销毁与创建DOM元素。

<div [hidden]="!isShow">
    // 内容区域
</div>

注意事项:

1、需要注意的是angular中去遍历对象

直接使用ngFor是无法遍历拿到键值对的,这里有两个做法可以参考:
1、使用自定义的管道符@Pipe可以拿到键值对的形式的数据。
2、使用Object.keys()

interface User {
  name?: string;
  age?:number;
  value?:string;
}

objectKeys = Object.keys;
items:User = { name: 'value 1', age: 20, value: 'value' };

<div *ngFor="let i of objectKeys(items);let key = index;">
  {{i + ' : ' + items[i]}}
</div>

使用这种方法需要现在ts.config.json文件中加入一个配置项:

    "suppressImplicitAnyIndexErrors":true,
image.png
2、直接使用 DOM API 获取页面上的元素

直接通过querySelector()获取页面中的元素,通常不推荐使用这种方式。更好的方案是使用 @ViewChild和模板变量
不推荐的写法:

@Component({
  selector: 'my-comp',
  template: `
    <input type="text" />
    <div> 内容部分 </div>
  `
})
export class MyComp {
  constructor(el: ElementRef) {
    el.nativeElement.querySelector('input').focus();
  }
}

官网建议的格式:

@Component({
  selector: 'my-comp',
  template: `
    <input #myInput type="text" />
    <div> 内容部分 </div>
  `
})
export class MyComp implements AfterViewInit {
  @ViewChild('myInput') input: ElementRef;

  constructor(private renderer: Renderer) {}

  ngAfterViewInit() {
    this.renderer.invokeElementMethod(this.input.nativeElement, 'focus');
  }
}

@ViewChild()属性装饰器,支持设置返回对象的类型

@ViewChild('myInput') myInput1: ElementRef;
@ViewChild('myInput', {read: ViewContainerRef}) myInput2: ViewContainerRef;

// 若未设置 read 属性,则默认返回的是 ElementRef 对象实例

相关文章

  • Angular框架中的模板语法和常用指令

    模板表达式(属性绑定): 输入属性的值为实例属性: 事件绑定: 双向数据绑定: *与template: 1、*ng...

  • Angular中的模板驱动表单和响应式表单

    1、模板驱动表单 根据angular模板语法,再结合专门的指令构建的表单。比如下面通过[(ngModal)],根据...

  • 自定义指令(上)

    简介 在常用指令的章节中我们讲了Angular提供的指令,这些指令是Angular内部封装好指令,我们开箱...

  • Angular4-学习笔记-4-模板语法

    学习资料来自 Angular.cn 与 Angular.io。 模板语法 在线例子 在 Angular 中,组件扮...

  • Vue的基本属性&&事件

    Vue的基本指令 Vue和Angular的用法差不多,语法和属性也差不多,Vue更像是国人的框架,所有的用法和习惯...

  • Angular2.x 指令

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

  • Angular 知识点记录二

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

  • Ionic3 自定义指令

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

  • angularJS优缺点

    优点 模板功能强大丰富,并且是声明式的,自带了丰富的Angular指令; 是一个比较完善的前端MV*框架,包含模板...

  • 01Vue基本使用与模板语法

    Vue基本使用与模板语法 一. 基本使用 Hello World快速入门 二. 模板语法 指令 概述 指令的本质就...

网友评论

    本文标题:Angular框架中的模板语法和常用指令

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