Angular 从入坑到挖坑 - 组件食用指南 (3)

绑定事件

通过使用 $event 作为方法的参数会将许多用不到的模板信息传递到组件中,导致我们在仅仅是为了获取数据的前提下,却需要对于页面元素十分了解,违背了模板(用户所能看到的)与组件(应用如何去处理用户数据)之间的关注点分类的原则。因此,这里应该使用模板引用变量的方式获取数据信息。

模板引用变量是对模板中 DOM 元素的引用,提供了从模块中直接访问元素的能力。

<input type="text" #refMsgInput (keyup)="getRefMsg(refMsgInput.value)"> <p>通过模板引入变量的方式获取到输入的值:{{refMsg}}</p> import { Component, OnInit } from '@angular/core'; @Component({ selector: 'app-product-list', templateUrl: './product-list.component.html', styleUrls: ['./product-list.component.scss'] }) export class ProductListComponent implements OnInit { public refMsg: string; constructor() { } ngOnInit(): void { } getRefMes(msg: string) { this.refMsg = msg; } }

模板引用变量的作用域是整个模板,因此要确保一个模板中的引用变量名称是唯一的,同时,在声明引用变量时,也可以使用 ref- 代替 #

<input type="text" ref-refMsgInput (keyup)="getRefMsg(refMsgInput.value)"> <p>通过模板引入变量的方式获取到输入的值:{{refMsg}}</p> 4.2、指令 4.2.1、属性型指令

属性型指令被应用在视图 dom 元素上,用来改变 dom 元素的外观或行为

NgClass:用来设置元素的多个 css 类属性,如果只设置一个 css 类,应该使用模板绑定语法中 class 类绑定

<p [ngClass]="inlineStyle">NgClass 属性指令</p> import { Component, OnInit } from '@angular/core'; @Component({ selector: 'app-product-list', templateUrl: './product-list.component.html', styleUrls: ['./product-list.component.scss'] }) export class ProductListComponent implements OnInit { public inlineStyle: {}; constructor() { } ngOnInit(): void { this.setInlineStyle(); } setInlineStyle() { this.inlineStyle = { 'text-red': true, 'bg-blue': false, }; } }

这里的 text-red、bg-blue 都是 css 类名,如果想要在指定的元素上添加该类,则 css 类名对应的值为 true,反之则为 false

NgStyle:用来设置元素的多个内联样式,如果只设置一个内联样式,应该使用模板绑定语法中的样式绑定

<p [ngStyle]="currentStyles">NgStyle 属性指令</p> import { Component, OnInit } from '@angular/core'; @Component({ selector: 'app-product-list', templateUrl: './product-list.component.html', styleUrls: ['./product-list.component.scss'] }) export class ProductListComponent implements OnInit { public currentStyles: {}; constructor() { } ngOnInit(): void { this.setCurrentStyles(); } setCurrentStyles() { this.currentStyles = { 'font-style': 'italic', 'font-weight': 'bold', 'font-size': '24px' }; } }

通过在组件的属性中设置多个内联样式对象的形式,完成对于页面元素样式的批量设置

NgModel:双向数据绑定

<input type="text" [(ngModel)]="name">

内置属性型指令

4.2.2、结构型指令

结构型指令用来操作 dom 树,通过进行一些的逻辑判断,从而完成对于页面布局的修改

NgIf:根据表达式的值(true or false)来创建或者销毁 dom 元素

<p *ngIf="expr">NgIf 结构型指令</p>

当 expr 属性为 true 时,这个元素则会显示在页面上,当属性值为 false 时,则不显示该元素

ngIf 指令并不是通过使用 css 样式来隐藏元素的,当值为 false 时,则这些元素会从 dom 中被销毁,并且所有监听该 dom 元素的事件会被取消,当重新显示该元素时,会重新执行初始化的过程

与销毁元素不同,对于隐藏的元素来说,所有的元素监听事件还会执行监听的,再次显示时不用重新进行初始化过程

NgFor:通过定义单条数据的显示格式,angular 以此为模板,循环渲染出所有的数据

<p *ngFor="let item of products; let i = index">{{i+1}} - {{item.name}} --- {{item.price}}</p> import { Component, OnInit } from '@angular/core'; @Component({ selector: 'app-product-list', templateUrl: './product-list.component.html', styleUrls: ['./product-list.component.scss'] }) export class ProductListComponent implements OnInit { public products = [{ 'name': 'lalala', 'price': '$200' }, { 'name': 'hehehe', 'price': '$400' }, { 'name': 'wuwuwu', 'price': '$120' }, { 'name': 'xixi', 'price': '$570' }]; constructor() { } ngOnInit(): void { } }

NgFor 指令上下文中的 index 属性在每次迭代中,会获取到条数据的索引值

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpyfwf.html