原文出处:https://www.jianshu.com/p/3a0075e82e52  (建议阅读原文)

ionic3开发框架是angular4,所以了解一下angular4的一些基础知识,能让你更好的开发应用。

angular4提供了很多功能强大的内置指令,但在现实情况中,这些内置指令可能还不能完全满足实际要求,这时我们就需要编写自定义指令来实现特定要求。

其实ionic3(angualr4)和ionic2(angular2)差不多,但和ionic1(angular1)就差别非常大了,可以说基本是推倒了重来。在angular1时代,组件和指令是一回事,即严格来说,没有组件这概念,只有指令,而到了angular2时代,虽说组件仍是一种特殊的指令,但已经有一定目的明显区分开来,分别用Directive和Component来标识,用cli生成命令就如下所示:

ionic g directive 指令名
ionic g component 组件名

要说指令和组件的区别,简单说是不带视图和带视图的区别,直观效果是:一个为原有标签动态添加功能,另一个为新建自定义功能标签,详细上有不少细节上的不同。

往往很多人会封装组件,但不会去封装指令,而选择用Provider或者Pipe(管道,相当于angular1时的过滤器filter),甚至样式来实现,虽说这也能解决部分问题,但不是最优的,Directive、Componet、Provider、Pipe都有其专业适用场景,如结构性指令(下面会说),就不好用Provider和Pipe来处理。

Directive——指令

三种分类:

  1. 属性指令
    属性指令指的是以属性形式使用的指令,如ngModel、ngClass、ngStyle等。

  2. 结构指令
    结构指令,用于修改DOM结构。其实就是模版指令,如ngIf,当条件为true时,该元素会被添加到DOM中。其主要依赖TemplateRef和ViewContainerRef来完成操作。TemplateRef用来访问组件的模板,而ViewContainerRef可作为视图内容渲染器,将模板内容插入至DOM中。

  3. 组件
    这个不必说了,我们用得最多的便是组件。与其他指令不同,它描述的是一个视图,是用户可以直接看到的东西。

自定义属性指令

实例:创建一个bgColor属性指令,支持传入颜色名参数,设置目标标签的背景色

1)创建指令。cli使用如下命令创建基本指令,会生成bg-color.ts文件:

ionic g directive bgColor

2)修改指令。在构造函数constructor加上一句,赋值默认颜色:

import { Directive, Input, ElementRef  } from '@angular/core';@Directive({selector: '[bg-color]' // Attribute selector
})
export class BgColorDirective {constructor(private el: ElementRef) {this.el.nativeElement.style.backgroundColor = 'red';}
}

基于安全性考虑,angualr2的文档是建议用Renderer来代替ElementRef使用,有兴趣的可以自行了解下Renderer

3)使用指令
如果调用的页面用了懒加载,在调用指令的页面module.ts里导入指令并声明,反之,在app.module.ts里导入指令并声明,这样调用的组件就能识别该指令了:

import { BgColorDirective } from '../../directives/bg-color/bg-color';@NgModule({declarations: [ContactPage,BgColorDirective],...
})

在ContactPage.html里这样使用即可查看效果:

<button ion-button bg-color>test</button>

指令效果.png

4)指令扩展,支持输入参数。
上述指令是一个很简单的指令,且很不灵活,因为颜色写死为red了,实际上我们使用场景应该支持多种颜色。那我们这样修改:

import { Directive, Input, ElementRef  } from '@angular/core';@Directive({selector: '[bg-color]' // Attribute selector
})
export class BgColorDirective {defaultColor: string = 'red';   //默认颜色@Input('bg-color')set backgroundColor(color:string) {this.setStyle(color);};constructor(private el: ElementRef) {this.setStyle(this.defaultColor);}private setStyle(color: string) {this.el.nativeElement.style.backgroundColor = color;}
}

改动的只是用@Input装饰器修饰,然后用set方法触发获得值后的操作。

我们在组件html里就可以这样调用了:

  <button ion-button bg-color="green">test</button>

指令效果.png

5)指令扩展,支持事件操作
我们增加一个点击事件响应操作,点击时,循环切换背景色。为实现该功能,我们需要在事件处理函数上添加@HostListener装饰器,代码改动如下:

import { Directive, Input, ElementRef, HostListener  } from '@angular/core';@Directive({selector: '[bg-color]' // Attribute selector
})
export class BgColorDirective {defaultColor: string = 'red';   //默认颜色bgColor: string;    //背景颜色@Input('bg-color')set backgroundColor(color:string) {this.setStyle(color);this.bgColor = color;};constructor(private el: ElementRef) {this.setStyle(this.defaultColor);}private setStyle(color: string) {this.el.nativeElement.style.backgroundColor = color;}@HostListener('click')onClick() {let color: string = this.el.nativeElement.style.backgroundColor == this.defaultColor ? this.bgColor :  this.defaultColor;this.setStyle(color);}
}

效果图为:我懒得做gif,你想象一个点击循环切换背景色的按钮吧。

自定义结构指令

实例:山寨一个*ngIf的的收缩显示指令,仅为了起到抛砖引玉效果。

为实现该指令,要借用TemplateRef和ViewContainerRef,TemplateRef用来访问组件的模板,而ViewContainerRef可作为视图内容渲染器,将模板内容插入至DOM中。

import { Directive, Input, TemplateRef, ViewContainerRef } from '@angular/core';@Directive({selector: '[expand]' // Attribute selector
})
export class ExpandDirective {@Input('expand')set condition(newCondition:boolean) {if(!newCondition) {this.viewContainer.createEmbeddedView(this.templateRef);} else {this.viewContainer.clear();}}constructor(private templateRef: TemplateRef<any>, private viewContainer:ViewContainerRef) {
}
}

同样别忘了在module里引入后,再在html里使用:

  <div *expand="isExpand"><button ion-button>test</button></div><div *expand="!isExpand">一段文字</div>

效果图不上了,留待你们试验,哇咔咔。

Component——组件

ionic g component ContentEmpty

关于component,太多文章讲了,这里我不详细说明,主要就两个装饰器:@Input、@Output,分别用于属性和事件绑定。对于事件,使用EventEmitter发送参数即可。直接上代码:

组件ts部分:

import { Component, Input, Output, EventEmitter } from '@angular/core';@Component({selector: 'content-empty',templateUrl: 'content-empty.html'
})
export class ContentEmptyComponent {@Input() btnWorkText: string = '';    //加载成功后按钮文字@Output() doWork: EventEmitter<any> = new EventEmitter();constructor() {
}onDoWork($event){this.doWork.emit($event);}
}

组件html部分:

    <button ion-button *ngIf="btnWorkText" color="blue" round outline small (click)="onDoWork($event)" >{{btnWorkText}}</button>

同样在module里引入后,在html如下调用即可:

<content-empty [btnWorkText]="数据加载中" (doWork)="方法()"></content-empty>

总结:可以看出来,自定义指令和组件不算复杂,只是大家都没有要去封装的概念。如果几乎不需要复用的东西,直接用内置指令实现就好了,否则就要考虑自定指令了,能让你的项目结构更清晰化,至于选择哪种,自己静下心来想一下就好了。

作者:IT晴天
链接:https://www.jianshu.com/p/3a0075e82e52
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

ionic3应该善用组件和指令 (实用、赞)相关推荐

  1. m_Orchestrate learning system---六、善用组件插件的好处是什么

    m_Orchestrate learning system---六.善用组件插件的好处是什么 一.总结 一句话总结: 1.面包屑导航是什么? 知道它是什么自然就知道它怎么用了 2.表格里面的栏目能能点 ...

  2. Angular2组件与指令的小实践——实现一个图片轮播组件

    如果说模块系统是Angular2的灵魂,那其组件体系就是其躯体,在模块的支持下渲染出所有用户直接看得见的东西,一个项目最表层的东西就是组件呈现的视图. 而除了直接看的见的躯体之外,一个完整的" ...

  3. 一文带你解决Git那些事~ git 指令 实用指南

    Git是目前世界上最先进的分布式版本控制系统.虽然日常中最多的在上面找项目代码...... Git有非常完善版本控制流程,适合团体和个人的开发,提升开发效率,企业开发必备!日常使用的时候可能接触更多的 ...

  4. Linux操作系统下的常用基本指令(实用加收藏)

    别错过日落和夕阳 目录 Linux常用基本指令 一.关机注销相关指令 1.shutdown 2.halt 3.reboot 4.sync 5.logout 2.用户管理相关指令 1.运行级别 切换运行 ...

  5. vant组件做表格_有赞Vant组件库上线墨刀!以后轻松做出电商原型

    继上周新上线了简历模板之后,本周墨刀的原型模板库又欢喜地增添一名新成员! 有赞Vant组件库 (做电商的宝宝要捂嘴笑了) Vant 组件库是有赞前端团队开源的一套基于Vue的UI组件库,目前版本收录了 ...

  6. 墨刀联合有赞Vant组件库,让你轻松设计出电商原型

    继上周新上线了简历模板之后,本周墨刀的原型模板库又欢喜地增添一名新成员! 有赞Vant组件库 (做电商的宝宝要捂嘴笑了) Vant 组件库是有赞前端团队开源的一套基于Vue的UI组件库,目前版本收录了 ...

  7. angular 指令渲染_Angular 组件交互 ngOnChanges 监听某一属性值变更

    我们在实际项目中会拆分各个功能模块,以便页面复用,避免重复工作.那么,这里就涉及到组件之间的交互问题.例如常使用的,输入型数据绑定.setter截听.ngOnChanges()截听以及通过创建引入服务 ...

  8. 第十章:动态组件,插槽,自定义指令

    第十章:动态组件,插槽,自定义指令 本章任务 动态组件 插槽 自定义指令 vant UI 组件库 axios的配置 本章内容 动态组件 自定义指令 一.动态组件 1.1 什么是动态组件 概念:动态组件 ...

  9. LibreOffice 中的六大实用扩展组件

    LibreOffice 中的六大实用扩展组件 图片来源:Opensource.com LibreOffice 是最好的自由办公套件,并在所有的主要 Linux 发行版中得到应用.尽管 LibreOff ...

最新文章

  1. c语言程序设计电大作业,电大C语言程序设计第1234次作业及答案
  2. [公告]向大家汇报服务器的情况
  3. 几何画板200个经典课件_几何画板Sketchpad Mac(数学教学软件)中文版
  4. travis-ci中的checkpatch工具使用
  5. vc 6.0 显示文件全路径_Linux常用命令大全(非常全!!!)
  6. 使用VMDepot镜像快速部署CKAN开放数据门户
  7. Spark(十二) -- Spark On Yarn Spark as a Service Spark On Tachyon
  8. 我的世界java版记分板_我的世界计分板教程 计分板指令详解
  9. 新电脑怎么分盘_新买的笔记本电脑收货后,该如何验机?
  10. C++ int型与char型辨析
  11. python职业发展方向_59秒看懂IT运维的发展方向及职业规划
  12. Redis,Memcache,MongoDb的特点与区别
  13. 【面试指南】如何看待你的竞争对手30k,而你却3k?想要高薪,我们也要学会拧螺丝、造飞机的能力
  14. KANO 模型——卡诺模型
  15. (山理工 1243)母牛问题(大牛生小牛,小牛生。。。。)
  16. FRAM芯片扩展在低功率应用中的耐力
  17. USV(Unmanned Surface Vessels)研究概况和发展趋势
  18. Android Connectivity分析(1)- ConnectivityManager
  19. Converged Multimedia Networks
  20. 车载调频发射机解决方案

热门文章

  1. java入门好学吗_java好学吗?我是小白中的小白,零基础...
  2. 抖音集锦(你不得不看的那些镜头)
  3. 分布式一致性算法—— 2PC与3PC
  4. 五万字长文总结 C/C++ 知识
  5. 硬件学习 软件Cadence day07 PCB 底板电路图布线
  6. Redis五种数据结构及实现原理
  7. 合宙模块LUA相关资料汇总
  8. vue 指定元素滚动到页面可视区域
  9. 计算机音乐b型谱简单,《神奇秘谱》琴曲的调弦法
  10. pip联网问题 SSLError(SSLError(1, ‘[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:748