今天我们要讲的是ng2的Attribute directives。顾名思义,就是拓展dom属性的指令。这算是指令的第二课了,因为上节课的components实质也是指令。
例子
这个例子共两个指令,第一个是redify指令,能使元素的color属性变红。另外一个直接复制官网的highlight指令,但是我自己做了很多变化,来讲解写法的多样化。
@Directive
写指令,你需要从'angular2/core'
中导入Directive
,然后使用@Directive
装饰器去装饰一个类:
app/directives.ts
1 | import {Directive, ElementRef, Renderer} from 'angular2/core'; |
这段代码做了这些事:
- 在装饰器
@Directive
中定义选择器redify
- 在类
Redify
中的构造函数里面注入ElementRef
,来获取当前的dom元素 - 同样注入
Renderer
服务来操作dom,使其color
属性为红色
服务是可以注入指令的。Renderer
服务提供了多种操作dom样式的方法。
事件监听
如何实现指令的事件监听呢?答案是设置host
:
src/app/highlight.directive.ts
1 | host: { |
我们在@Directive
中设置host
元数据,host
是个对象,你可以通过host
配置指令的事件监听,当事件发生,将触发相应的成员函数。本例子中,设置了鼠标进入和离开两个鼠标事件。并在类中编写相应的成员函数:
src/app/highlight.directive.ts
1 | onMouseEnter() { this._highlight(this.highlightColor || this._defaultColor); } |
@Input
如果需要向指令中输入什么,那么需要@input
这个装饰器,从'angular2/core'
中导入Input
即可使用:
1 | 'myHighlight') highlightColor: string; ( |
上述代码我们做了几件事:
- 给成员变量
highlightColor
,装饰一个@Input('myHighlight')
,使其等于从myHighlight
输入的属性 - 设置一个私有成员变量
_defaultColor
defaultColor
属性有个setter
,可以重写_defaultColor
变量,使_defaultColor
等于从defaultColor
属性输入的值或者其本身默认值
这都什么鬼?没有接触过装饰器的同学可能觉得不舒服。这是es7里面的语法糖,python里面也有,是一种函数式编程。装饰器实质是个函数,可以多个嵌套装饰。
指令的@Input
装饰器,有两种写法:
一就是给成员变量加个装饰器:
1 | 'myHighlight') ( |
代表从myHighlight
属性输入的值会赋给成员变量highlightColor
。
二就是使用set
,编写一个函数,重写相关的成员变量,不明白get
和set
用法的同学可以参考这个:
1 | private _defaultColor = 'red'; |
我们来两个替换一下把:
1 | private highlightColor:string; |
仍然可以运行!
使用指令
导入指令的类,然后注入组件的directives
中[Redify,HighlightDirective]
,就可以在模板中使用指令了,这跟组件嵌套是一样的。
app/app.ts
1 | import {Component} from 'angular2/core'; |
我们在模板语法里面讲过,[]是单向属性绑定的语法,里面可以是任何hmtl5属性,当然也可以是我们拓展的html属性,即指令。毕竟angular仍然是”旨在拓展html能力”。
[myHighlight]="color"
将成员变量color
绑定在myHighlight
属性中,[defaultColor]="'violet'"
给defaultColor
设置了'violet'
的值。
教程示例代码及目录
示例代码:https://github.com/lewis617/angular2-tutorial