angular自定义指令相关知识及代码
原文地址
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自定义指令相关知识及代码的更多相关文章
- Angular自定义指令(directive)
		
angular自定义指令,意我们可以通过angula自己定义指令,来实现我们的特殊要求,为所欲为,一支穿云箭,千军万马来相见 多少年的老规矩了,先看代码: <!DOCTYPE html> ...
 - angular  自定义指令详解   Directive
		
在angular中,Directive,自定义指令的学习,可以更好的理解angular指令的原理,当angular的指令不能满足你的需求的时候,嘿嘿,你就可以来看看这篇文章,自定义自己的指令,可以满足 ...
 - Angular自定义指令directive:scope属性
		
在AngularJS中,除了内置指令如ng-click等,我们还可以自定义指令.自定义指令,是为了扩展DOM元素的功能.代码中,通过指定directive中的restrict属性,来决定这个指令是作为 ...
 - Angular17 Angular自定义指令
		
1 什么是HTML HTML文档就是一个纯文本文件,该文件包含了HTML元素.CSS样式以及JavaScript代码:HTML元素是由标签呈现,浏览器会为每个标签创建带有属性的DOM对象,浏览器通过渲 ...
 - angular 自定义指令 directive  transclude 理解
		
项目中断断续续的用了下angular,也没狠下心 认真的学习.angular 特别是自定义指令这块 空白. transclude 定义是否将当前元素的内容转移到模板中.看解释有点抽象. 看解释有点抽象 ...
 - angular自定义指令
		
1.在directive文件下创建指令的js文件 通常自定义指令需要声明模块(注意定义指令时, js内部指令名称需采用 aaAaBb驼峰的命名方式 html中使用的是aa-aa-bb) e.g (f ...
 - angular -- 自定义指令和模板
		
angular 可以自定义一些指令,来简化我们前端的工作量. 第一种:简单指令示例: <h3>自定义指令</h3> <sheng></sheng> &l ...
 - angular自定义指令命名的那个坑
		
Directive 先从定义一个简单的指令开始. 定义一个指令本质上是在HTML中通过元素.属性.类或注释来添加功能.AngularJS的内置指令都是以ng开头,如果想自定义指令,建议自定义一个前缀代 ...
 - angular自定义指令 repeat 循环结束事件;limitTo限制循环长度、限定开始位置
		
1.获取repeat循环结束: 自定义指令: .directive('repeatFinish', function () { return { link: function (scope, elem ...
 
随机推荐
- cocoapod卡在了analyzing dependencies
			
尽管公司的项目没有使用cocoapod,可是有一些第三方库本身依赖其它第三方的库,而且是用cocoapod来管理这些依赖的.所以在使用某些第三方库时.还是须要用到cocoapod的.今天在github ...
 - POJ--2516--Minimum Cost【最小费用最大流】
			
链接:http://poj.org/problem?id=2516 题意:有k种货物,n个客户对每种货物有一定需求量,有m个仓库.每一个仓库里有一定数量的k种货物.然后k个n*m的矩阵,告诉从各个仓库 ...
 - C#打印日志的小技巧(转)
			
https://www.cnblogs.com/jqg-aliang/p/5234206.html 打印日志的函数 开发中输出日志必不可少,在C#中输出多个不同类型参数的时候,需要连接符累加输出,很是 ...
 - Django项目之Web端电商网站的实战开发(二)
			
说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 接着上一篇博客继续往下写 :https://blog.csdn.net/qq_41782425/article/details/8 ...
 - C++ 复制到粘贴板
			
网上好多教程讲如何复制到剪切板,但是有可能复制的是乱码,为了方便,将CString类型的复制到剪切板 CString source;if (OpenClipboard()){//防止非ASCII语言复 ...
 - [JWT] JWT with HS256
			
The advantages of JWT over traditional session based validation is: it effectively removing all auth ...
 - Android时间对话框TimePickerDialog介绍
			
目前网上流行着很多对“时间对话框TimePickerDialog”的讲解文章,但感觉都不是很详细.这里详细对该方面的知识进行介绍,旨在帮助初学者能够快速掌握该项技术. 首先要做的是声明一个日历类的对象 ...
 - C Tricks(十八)—— 整数绝对值的实现
			
为正还是为负:(对 int 类型而言,第一位为符号位,其余为数值,则右移 31 位,再与 1 求与) 如果为正 ⇒ 返回原值 如果为负 ⇒ 对其二进制形式各位取反 + 1 int abs(int x) ...
 - Log4j.properties 属性详解以及 LOG4J日志级别详解
			
转自:https://blog.csdn.net/lovely0903jpp/article/details/82261607 假如项目的生产环境上增加请求以及响应信息的打印,这个时候,对于新手来说, ...
 - 黑马day01 xml 的解析方式
			
XML编程:利用java程序去增删改查(CRUD)xml中的数据 解析思想: dom解析 sax解析 基于这两种解析思想市面上就有了非常多的解析api sun jaxp既有dom方式也有sax方式,而 ...