angular2系列教程(四)Attribute directives
今天我们要讲的是ng2的Attribute directives。顾名思义,就是操作dom属性的指令。这算是指令的第二课了,因为上节课的components实质也是指令。
例子
这个例子共两个指令,第一个是redify指令,能使元素的color属性变红。另外一个直接复制官网的highlight指令,但是我自己做了很多变化,来讲解写法的多样化。
@Directive
写指令,你需要从'angular2/core'中导入Directive,然后使用@Directive装饰器去装饰一个类:
app/directives.ts
import {Directive, ElementRef, Renderer} from 'angular2/core';
@Directive({
selector: '[redify]'
})
export class Redify {
constructor(private _element: ElementRef, private renderer: Renderer) {
renderer.setElementStyle(_element.nativeElement, 'color', 'red');
}
}
这段代码做了这些事:
- 在装饰器@Directive中定义选择器redify
- 在类Redify中的构造函数里面注入ElementRef,来获取当前的dom元素
- 同样注入Renderer服务来操作dom,使其color属性为红色
服务是可以注入指令的。Renderer服务提供了多种操作dom样式的方法。
事件监听
如何实现指令的事件监听呢?答案是设置host:
src/app/highlight.directive.ts
host: {
'(mouseenter)': 'onMouseEnter()',
'(mouseleave)': 'onMouseLeave()'
}
我们在@Directive中设置host元数据,host是个对象,你可以通过host配置指令的事件监听,当事件发生,将触发相应的成员函数。本例子中,设置了鼠标进入和离开两个鼠标事件。并在类中编写相应的成员函数:
src/app/highlight.directive.ts
onMouseEnter() { this._highlight(this.highlightColor || this._defaultColor); }
onMouseLeave() { this._highlight(null); }
@Input
如果需要向指令中输入什么,那么需要@input这个装饰器,从'angular2/core'中导入Input即可使用:
@Input('myHighlight') highlightColor: string;
private _defaultColor = 'red';
@Input() set defaultColor(colorName:string){
this._defaultColor = colorName || this._defaultColor;
}
上述代码我们做了几件事:
- 给成员变量highlightColor,装饰一个@Input('myHighlight'),使其等于从myHighlight输入的属性
- 设置一个私有成员变量_defaultColor
- defaultColor属性有个setter,可以重写_defaultColor变量,使_defaultColor等于从defaultColor属性输入的值或者其本身默认值
这都什么鬼?没有接触过装饰器的同学可能觉得不舒服。这是es7里面的语法糖,python里面也有,是一种函数式编程。装饰器实质是个函数,可以多个嵌套装饰。
指令的@Input装饰器,有两种写法:
一就是给成员变量加个装饰器:
@Input('myHighlight')
highlightColor: string;
代表从myHighlight属性输入的值会赋给成员变量highlightColor。
二就是使用set,编写一个函数,重写相关的成员变量,不明白get 和set 用法的同学可以参考这个: getters and setters
private _defaultColor = 'red';
@Input() set defaultColor(colorName:string){
this._defaultColor = colorName || this._defaultColor;
}
我们来两个替换一下把:
private highlightColor:string;
@Input() set myHighlight(colorName:string){
this.highlightColor=colorName
}
@Input('defaultColor')
private _defaultColor = 'red';
仍然可以运行!
使用指令
导入指令的类,然后注入组件的directives中[Redify,HighlightDirective],就可以在模板中使用指令了,这跟组件嵌套是一样的。
app/app.ts
import {Component} from 'angular2/core';
import {bootstrap} from 'angular2/platform/browser';
import {Redify} from './directives';
import {HighlightDirective} from './highlight.directive';
@Component({
selector: "app",
directives:[Redify,HighlightDirective],
template: `
redify:
<p redify >hello,lewis</p>
myHighlight:
<div>
<input type="radio" name="colors" (click)="color='lightgreen'">Green
<input type="radio" name="colors" (click)="color='yellow'">Yellow
<input type="radio" name="colors" (click)="color='cyan'">Cyan
</div>
<p [myHighlight]="color">Highlight me!</p>
<p [myHighlight]="color" [defaultColor]="'violet'">Highlight me too!</p>
`
})
export class App {
constructor() {
}
}
bootstrap(App, [])
.catch(err => console.error(err));
我们可以看到<p redify >hello,lewis</p>,redify指令就是元素的一个属性而已。
而highlight则使用了[]
<p [myHighlight]="color">Highlight me!</p>
<p [myHighlight]="color" [defaultColor]="'violet'">Highlight me too!</p>
我们在模板语法里面讲过,[]是单向属性绑定的语法,里面可以是任何hmtl5属性,当然也可以是我们拓展的html属性,即指令。毕竟angular仍然是“旨在拓展html能力”。
[myHighlight]="color"将成员变量color绑定在myHighlight属性中,[defaultColor]="'violet'"给defaultColor设置了'violet'的值。
教程源代码及目录
如果您觉得本博客教程帮到了您,就赏颗星吧!
https://github.com/lewis617/angular2-tutorial
angular2系列教程(四)Attribute directives的更多相关文章
- angular2系列教程(十)两种启动方法、两个路由服务、引用类型和单例模式的妙用
今天我们要讲的是ng2的路由系统. 例子
- angular2系列教程(一)hello world
今天我们要讲的是angular2系列教程的第一篇,主要是学习angular2的运行,以及感受angular2的components以及模板语法. 例子 这个例子非常简单,是个双向数据绑定.我使用了官网 ...
- CRL快速开发框架系列教程四(删除数据)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- C#微信公众号开发系列教程四(接收普通消息)
微信公众号开发系列教程一(调试环境部署) 微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南) C#微信公众号开发系列教程三(消息体签名及加解密) C ...
- Android Studio系列教程四--Gradle基础
Android Studio系列教程四--Gradle基础 2014 年 12 月 18 日 DevTools 本文为个人原创,欢迎转载,但请务必在明显位置注明出处!http://stormzhang ...
- NGUI系列教程四(自定义Atlas,Font)
今天我们来看一下怎么自定义NGUIAtlas,制作属于自己风格的UI.第一部分:自定义 Atlas1 . 首先我们要准备一些图标素材,也就是我们的UI素材,将其导入到unity工程中.2. 全选我们需 ...
- 黄聪:Microsoft Enterprise Library 5.0 系列教程(四) Logging Application Block
原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(四) Logging Application Block 企业库日志应用程序模块工作原理图: 从上图我们可以 ...
- Fastify 系列教程四 (求对象、响应对象和插件)
Fastify 系列教程: Fastify 系列教程一 (路由和日志) Fastify 系列教程二 (中间件.钩子函数和装饰器) Fastify 系列教程三 (验证.序列化和生命周期) Fastify ...
- webpack4 系列教程(四): 单页面解决方案--代码分割和懒加载
本节课讲解webpack4打包单页应用过程中的代码分割和代码懒加载.不同于多页面应用的提取公共代码,单页面的代码分割和懒加载不是通过webpack配置来实现的,而是通过webpack的写法和内置函数实 ...
随机推荐
- Matlab数值计算示例: 牛顿插值法、LU分解法、拉格朗日插值法、牛顿插值法
本文源于一次课题作业,部分自己写的,部分借用了网上的demo 牛顿迭代法(1) x=1:0.01:2; y=x.^3-x.^2+sin(x)-1; plot(x,y,'linewidth',2);gr ...
- ThinkPHP+Smarty模板中截取包含中英文混合的字符串乱码的解决方案
好几天没写博客了,其实有好多需要总结的,因为最近一直在忙着做项目,但是困惑了几天的Smarty模板中截取包含中英文混合的字符串乱码的问题,终于解决了,所以记录下来,需要的朋友看一下: 出现乱码的原因: ...
- iOS之App Store上架被拒Legal - 5.1.5问题
今天在看到App Store 上架过程中,苹果公司反馈的拒绝原因发现了这么一个问题: Legal - 5.1.5 Your app uses background location services ...
- Android Weekly Notes Issue #235
Android Weekly Issue #235 December 11th, 2016 Android Weekly Issue #235 本期内容包括: 开发一个自定义View并发布为开源库的完 ...
- 读过MBA的CEO更自私?《哈佛商业评论》2016年第12期。4星
老牌管理杂志.每期都值得精度.本期我还是给4星. 以下是本书中的一些内容的摘抄: 1:他们发现在Airbnb上,如果客人姓名听起来像黑人,那么比名字像白人的客人的接受率会低16%.#45 2:对立组织 ...
- osi(open system interconnection)模型的通俗理解
OSI模型的理解: 以你和你女朋友以书信的方式进行通信为例. 1.物理层:运输工具,比如火车.汽车. 2.数据链路层:相当于货物核对单,表明里面有些什么东西,接受的时候确认一下是否正确(CRC检验). ...
- .NET面试题系列[3] - C# 基础知识(1)
1 类型基础 面试出现频率:基本上肯定出现 重要程度:10/10,身家性命般重要.通常这也是各种招聘工作的第一个要求,即“熟悉C#”的一部分.连这部分都不清楚的人,可以说根本不知道自己每天都在干什么. ...
- 【腾讯Bugly干货分享】动态链接库加载原理及HotFix方案介绍
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57bec216d81f2415515d3e9c 作者:陈昱全 引言 随着项目中动 ...
- 使用Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境(二)
前言 上一篇随笔Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境(一)介绍maven和nexus的环境搭建,以及如何使用maven和nexus统一管理库 ...
- Android Material Design之 NavigationView侧滑界面自定义 随笔
一.侧滑界面Menu自定义: 在menu文件夹下新建activity_main_drawer.xml文件,自定义标题和icon: <?xml version="1.0" en ...