• Angular4.0从入门到实战打造在线竞拍网站学习笔记之四数据绑定&管道


    Angular4.0基础知识之组件
    Angular4.0基础知识之路由
    Angular4.0依赖注入
    Angular4.0数据绑定&管道

    数据绑定

    数据绑定允许你将组件控制器的属性和方法与组件的模板连接起来,大大降低了开发时的编码量。

    常见的表现形式有:

    • 插值表达式:<h1>{{title}}</h1>,即把属性|表达式插入到HTML标签中
    • 属性绑定:<img [src]="imgUrl" />,也就是将属性|表达式绑定到HTML标签的属性上
    • 事件绑定:<button (click)="show()"></button>,讲组件控制器的一个方法绑定到模板元素的事件上

    在Angular中,默认的数据绑定是单向的(AngularJS1.0中全部是双向绑定,这也是性能差的原因之一),所谓的双向绑定,也就是控制器的属性反映到模板中,同时,模板中显示出的属性被修改之后,对应的控制器属性同时发生变化;单向绑定取出了模板=>控制器的方向,使性能大大提升。(当然,双向绑定并不是被去掉了,你也可以手动指定使用双向绑定,双向绑定现在变成了一个可选项,而不是框架的默认行为)

    事件绑定

    <button (click)="doOnClick($event)"></button>
    
    doOnClick(event:any){
    	console.log(event);
    }
    

    如上代码是一个经典的事件绑定例子,被绑定的事件可以是一个标准事件也可以是一个自定义事件,绑定的操作可以是控制器里的一个方法,也可以只一个赋值表达式等等。

    属性绑定

    如下例子所示

    // 使用属性绑定
    <img [src]="imgUrl" />
    // 使用插值表达式
    <img src="{{imgUrl}}" />
    

    又是一个经典的例子,不难理解,上面两个方法实现的效果是完全一致的,事实上,这两个方法没有优劣之分,你只需要按照自己的喜好去选择即可

    HTML属性绑定

    1. 基本HTMl属性绑定
    <td [attr.colspan]="value"></td>
    
    1. class绑定
    <div class="aaa bbb" [class]="val"></div>	// 这种情况会覆盖原先的class
    <div [class.aaa]="booleanVal"></div>	// 通过一个Boolean值开关来控制是否启用某一个class名,适合管理单一class名
    <div [ngClass]="{aaa:isA,bbb:isB}"></div>	// 通过对象的形式开控制多个class的开关,适合同时管理多个className
    
    1. 样式绑定

    和class绑定类似,只不过绑定的对象为style属性

    <button [style.color]="isRed?'red':'green'">Red</button>
    <div [ngStyle]="{color:red,'font-style':bool?'italic':'normal'}"></div>
    

    双向绑定

    双向绑定即视图和模型保持同步,无论视图和模型哪一方改变,另一方都一起同步改变。

    前面所学到的事件绑定是从视图到模型,把模板中元素的事件绑定到控制器中的方法;属性绑定的方向是从控制器到模板,使用方括号讲组件控制器的属性绑定到模板。

    <input [value]="name" (input)="doOnInput($event)" />
    
    export class BindComponent implements OnInit {
    	name: string;
    	
    	doOnInput(event){
    		this.name=event.target.value;
    	}
    }
    

    这样就实现了一个双向绑定,当input内容变化的时候,出发事件,修改模型中的属性值,当模型中的属性值改变的时候,优惠在视图中表现出来。

    当然,Angular肯定提供了内置的双向绑定支持:

    <input [(ngModel)]="name" />
    

    由于[(ngModel)]用在input元素上,默认绑定的是input事件。双向绑定最常用的用途就是表单处理。

    当然,双向绑定本来就应该用于input系列元素上,因为这些元素允许你去修改这些值,并显示出来。

    将会在表单处理章节更详细讲。

    管道

    举个例子,例如我要在页面上显示我的生日信息,假设现在从服务器获取到的日期是一个Date对象,那么把它直接输出到页面上肯定是用户体验很不好的(一大串乱七八糟的字符串)。管道就是用来处理数据的,从原始值到你所需要的值,这一个过程。

    使用实例:

    <p>{{birthday | date | uppercase}}</p>
    

    上面例子中我们就使用了两个内置的管道,第一个是获取到Date对象的日期信息,第二个是把小写字母转换成大写。

    内置管道

    常用的管道:

    • uppercase 大写
    • lowercase 小写

    date日期管道

    日期管道符可以接受参数,用来规定输出日期的格式。
    <p>现在的时间是{{today | date:'yyyy-MM-dd HH:mm:ss'}}</p>

    number 数字处理管道

    接收的参数格式为{最少整数位数}.{最少小数位数}-{最多小数位数}
    其中最少整数位数默认为1
    最少小数位数默认为0
    最多小数位数默认为3
    当小数位数少于规定的{最少小数位数}时,会自动补0
    当小数位数多于规定的{最多小数位数}时,会四舍五入

    自定义管道

    1. 生成管道:ng g pipe pipe/multiple,此处用来做Demo的管道作用是扒一个数放大n倍,也就是乘法……

    生成的管道代码:

    import { Pipe, PipeTransform } from '@angular/core';
    
    @Pipe({
      name: 'multiple'
    })
    export class MultiplePipe implements PipeTransform {
    
      transform(value: any, args?: any): any {
        return null;
      }
    
    }
    

    可以看出,管道是一个实现了PipeTransform并且带有@Pipe装饰器的类,用于把源数据根据参数和方法定义处理成想要的结果。

    但是,当你打开app.modules.ts的时候,你会发现在declaration数组里多出来了一个MultiplePipe的声明,也就是说,管道也是需要声明的,只是命令行工具自动添加进去了。

    其中value是管道前端的原始值,args是一个可选参数,也就是管道的参数,最终管道把处理结果返回出去即可。

    如下,我们很轻易地创建了一个管道:

    import {Pipe, PipeTransform} from '@angular/core';
    
    @Pipe({
      name: 'multiple'
    })
    export class MultiplePipe implements PipeTransform {
    
      transform(value: number, args?: number): number {
        if (!args) {
          args = 1;
        }
        return value * args;
      }
    
    }
    

    在实战项目中,我们对管道有了新的用法,根据传入的参数来过滤商品列表:

    import {Pipe, PipeTransform} from '@angular/core';
    import {Product} from '../shared/product.service';
    
    @Pipe({
      name: 'productFilter'
    })
    export class ProductFilterPipe implements PipeTransform {
    
      transform(productList: Product[], filterField: string, keyword: string): any {
        if (!filterField || !keyword) {
          return productList;
        }
        return productList.filter((product: Product) => product[filterField].indexOf(keyword) >= 0);
      }
    
    }
    
  • 相关阅读:
    水晶报表 注册码
    黑马孕育期盘口的技术辨识(转贴)
    如何判断庄家出货(转贴)
    解决方案:用户 'sa' 登录失败。原因: 未与信任 SQL Server 连接相关联。
    水晶报表学习资料
    (网上收集)asp.net页面打印问题?
    arcgis地理配准第二种方法:利用已知控制点 (Spatial Adjustment和Georeferencing的区别)
    Vue父子组件之间通信
    Vue怎么引用组件和使用组件?
    ESLint:error 'reject' is defined but never used nounusedvars
  • 原文地址:https://www.cnblogs.com/jeferwang/p/7277655.html
Copyright © 2020-2023  润新知