原文地址

https://www.jianshu.com/p/0c015862156d

大纲

  1、自定义指令之——属性指令
  2、自定义属性指令的运行原理
  3、自定义属性指令代码实践
  4、自定义结构指令
  5、自定义结构指令代码实践

自定义指令之——属性指令

  在Angular2中,属性型指令的创建至少需要一个带有@Directive装饰器修饰的控制器类。@Directive装饰器指定了一个选择器名称,用于指出与此指令相关联的属性的名字。
  Angular会为每一个被指令匹配上的元素创建一个该指令对应的控制器类的实例。并自动注入该控制器类依赖的别的类的实例。比如上面的代码中,Angualr会选择合适的时机,为我们注入 ElementRef 和 Renderer 的实例。

自定义属性指令的运行原理

  Angular在编译模板时,检测到DOM元素上我们正在尝试绑定到某些属性 ,但Angualr并不能认识这些属性(非内置的属性指令)。Angular就会尝试在我们声明的 declarations 元数据数组中查找这个指令属性。 我们把 HighlightDirective 在元数据的 declarations 数组中进行了声明,这样一来 Angular 在发现这个指令的导入信息后,接着就会去检查对应的导入语句,从而找到 highlight.directive.ts 中导出的类,进而服务宿主元素对应的行为能力。

自定义属性指令代码实践

初级版——添加改变颜色

import { Directive, ElementRef, Renderer } from '@angular/core';
@Directive({
selector: '[prefixHighLight]'
})
export class HighlightDirective {
constructor(elem: ElementRef, renderer: Renderer) {
renderer.setElementStyle(elem.nativeElement, 'backgroundColor', 'red');
}
}

中级版——添加,当鼠标移动之后变色

import { Directive, ElementRef, Renderer, HostListener } from '@angular/core';

@Directive({
selector: '[prefixHighLight]'
})
export class HighlightDirective { private _domElem: ElementRef;
private _renderer: Renderer; constructor(elem: ElementRef, renderer: Renderer) {
this._domElem = elem.nativeElement;
this._renderer = renderer;
} @HostListener('mouseenter')
onMouseEnter() {
this._renderer.setElementStyle(this._domElem, 'backgroundColor', 'red');
} @HostListener('mouseleave')
onMouseLeave() {
this._renderer.setElementStyle(this._domElem, 'backgroundColor', null);
}
}

高级版本:自定义鼠标移动上去之后的颜色

import { Directive, ElementRef, Renderer, HostListener, Input } from '@angular/core';

@Directive({
selector: '[prefixHighLight]'
})
export class HighlightDirective {
//需要注意的是:这里的prefixHighLight不仅仅是指令的标识符,还是输入的绑定目标
@Input('prefixHighLight') highlightColor: string;
private _domElem: ElementRef;
private _renderer: Renderer; private _defaultColor = 'red'; constructor(elem: ElementRef, renderer: Renderer) {
this._domElem = elem.nativeElement;
this._renderer = renderer;
} @HostListener('mouseenter')
onMouseEnter() {
this._renderer.setElementStyle(this._domElem, 'backgroundColor', this.highlightColor || this._defaultColor);
} @HostListener('mouseleave')
onMouseLeave() {
this._renderer.setElementStyle(this._domElem, 'backgroundColor', null);
}
}

自定义结构指令

自定义结构指令代码实践

/*
指令功能描述:该指令实现 ngIf 指令相反的效果,当指令的输入条件为 Falsy 值时,显示DOM元素。
ex:
<h1 *exeUnless="condition">Hello {{name}}</h1>
*/
import { Directive, Input, TemplateRef, ViewContainerRef } from '@angular/core';
@Directive({
selector: '[exeUnless]'
})
export class UnlessDirective { @Input('exeUnless')
set condition(newCondition: boolean) {
if (!newCondition) { // 创建模板对应的内嵌视图
this.viewContainer.createEmbeddedView(this.templateRef);
} else {
this.viewContainer.clear();
}
}
constructor(private templateRef: TemplateRef<any>,
private viewContainer: ViewContainerRef) {
}
}

代码网址

angular的实例教程中的angular-directive-custom

参考网址

自定义指令

angular自定义指令相关知识及代码的更多相关文章

  1. Angular自定义指令(directive)

    angular自定义指令,意我们可以通过angula自己定义指令,来实现我们的特殊要求,为所欲为,一支穿云箭,千军万马来相见 多少年的老规矩了,先看代码: <!DOCTYPE html> ...

  2. angular 自定义指令详解 Directive

    在angular中,Directive,自定义指令的学习,可以更好的理解angular指令的原理,当angular的指令不能满足你的需求的时候,嘿嘿,你就可以来看看这篇文章,自定义自己的指令,可以满足 ...

  3. Angular自定义指令directive:scope属性

    在AngularJS中,除了内置指令如ng-click等,我们还可以自定义指令.自定义指令,是为了扩展DOM元素的功能.代码中,通过指定directive中的restrict属性,来决定这个指令是作为 ...

  4. Angular17 Angular自定义指令

    1 什么是HTML HTML文档就是一个纯文本文件,该文件包含了HTML元素.CSS样式以及JavaScript代码:HTML元素是由标签呈现,浏览器会为每个标签创建带有属性的DOM对象,浏览器通过渲 ...

  5. angular 自定义指令 directive transclude 理解

    项目中断断续续的用了下angular,也没狠下心 认真的学习.angular 特别是自定义指令这块 空白. transclude 定义是否将当前元素的内容转移到模板中.看解释有点抽象. 看解释有点抽象 ...

  6. angular自定义指令

    1.在directive文件下创建指令的js文件 通常自定义指令需要声明模块(注意定义指令时, js内部指令名称需采用 aaAaBb驼峰的命名方式  html中使用的是aa-aa-bb) e.g (f ...

  7. angular -- 自定义指令和模板

    angular 可以自定义一些指令,来简化我们前端的工作量. 第一种:简单指令示例: <h3>自定义指令</h3> <sheng></sheng> &l ...

  8. angular自定义指令命名的那个坑

    Directive 先从定义一个简单的指令开始. 定义一个指令本质上是在HTML中通过元素.属性.类或注释来添加功能.AngularJS的内置指令都是以ng开头,如果想自定义指令,建议自定义一个前缀代 ...

  9. angular自定义指令 repeat 循环结束事件;limitTo限制循环长度、限定开始位置

    1.获取repeat循环结束: 自定义指令: .directive('repeatFinish', function () { return { link: function (scope, elem ...

随机推荐

  1. Mysql学习总结(18)——Mysql主从架构的复制原理及配置详解

    一.复制概述 Mysql内建的复制功能是构建大型,高性能应用程序的基础.将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数据复制到其它主机(slaves)上,并重 ...

  2. 将已有的Eclipse项目转化为Maven项目

    将已有的Eclipse项目转化为Maven项目 我们之前在Eclipse IDE完成的Java命令行项目.Java Web项目也使用了构建工具--Ant,它帮助我们编译.运行Java源代码(无需我们自 ...

  3. 洛谷——P1498 南蛮图腾

    https://www.luogu.org/problem/show?pid=1498 题目描述 自从到了南蛮之地,孔明不仅把孟获收拾的服服帖帖,而且还发现了不少少数民族的智慧,他发现少数民族的图腾往 ...

  4. Android 使用AIDL实现进程间的通信

    在Android中,如果我们需要在不同进程间实现通信,就需要用到AIDL技术去完成. AIDL(android Interface Definition Language)是一种接口定义语言,编译器通 ...

  5. C# json 总结

    json格式字符串转换为实体类,大括号 {} 表示对象,[] 数组表示列表. json文件读取到内存中就是字符串,.NET操作json就是生成与解析json字符串. 添加引用:using Newton ...

  6. [转]Accept-Encoding

    原文地址:https://blog.csdn.net/sqzhao/article/details/49499471 HTTP Header中Accept-Encoding 是浏览器发给服务器,声明浏 ...

  7. 11. Linux——LCD驱动程序

    由上一节 得出写个LCD驱动入口函数,需要以下4步: 1) 分配一个fb_info结构体: framebuffer_alloc(); 2) 设置fb_info 3) 设置硬件相关的操作 4) 使能LC ...

  8. Vue 学习记录<1>

    1.环境搭建:(前提node.js搭建) # 全局安装 vue-cli $ npm install --global vue-cli   # 创建一个基于 webpack 模板的新项目 $ vue i ...

  9. ontouch、dispatchtouchevent、interceptouchevent-相关事件

    这几天一直在研究onTouch的相关方法,今天我们就来看看onTouchEvent.dispatchTouchEvent.onIntercepTouchEvent这三个方法在控件之间的传递顺序 pub ...

  10. 二、MongoDB基础知识

    1.文档是MongoDB的核心概念.文档就是键值对的一个有序集{'msg':'hello','foo':3}.类似于python中的有序字典. 需要注意的是: #1.文档中的键/值对是有序的. #2. ...