原文地址

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. jQuery过滤选择器具体解释

    基本过滤选择器 选取第一个元素(:first) //选择第一个div元素. $('#btn1').click(function(){ $('div:first').css("backgrou ...

  2. scroll- 滑动条风格调整

    <item name="scrollbarFadeDuration">250</item> <item name="scrollbarDef ...

  3. actionBar-shareIcon 分享按钮的修改

    今天为了修改图库的分享按钮,进行了很多的尝试 1.寻找到了xml文件,如下 <?xml version="1.0" encoding="utf-8"?&g ...

  4. JavaScript--数据结构与算法之列表

    3.1 列表的抽象数据类型定义 列表:一组有序的数据.每个列表中的数据称为元素.在JavaScript中列表的元素可以是任意的数据类型.列表中保存的元素没有事先的限定,实际使用时的元素数量受到程序内存 ...

  5. CSS min-height不能解决垂直外边距合并问题

    垂直外边距合并有一种情况是嵌套元素的垂直外边距合并,当父级元素没有设定外边距时,在顶部或者底部边缘的子元素的垂直外边距就会和父级的合并,导致父级也有了“隐形”的垂直外边距. 当父级元素的min-hei ...

  6. Vijos——T1279 Leave-绿光

    https://vijos.org/p/1279 背景 期待这一份幸运,和一份冲劲,多么奇妙的际遇…….燕姿在演唱完绿光这首歌后,出给了姿迷一个考题. 北欧有一个传说!人一生中能看见绿光!他就一生都可 ...

  7. C Tricks(十八)—— 整数绝对值的实现

    为正还是为负:(对 int 类型而言,第一位为符号位,其余为数值,则右移 31 位,再与 1 求与) 如果为正 ⇒ 返回原值 如果为负 ⇒ 对其二进制形式各位取反 + 1 int abs(int x) ...

  8. jquery中prop()和attr()的使用

    jquery1.6+出现的prop()方法. • 对于HTML元素本身就带有的固有属性,在处理时,使用prop方法. • 对于HTML元素我们自己自定义的DOM属性,在处理时,使用attr方法. • ...

  9. 7. 基于Express实现接口

    安装Mongoose 创建model //server/models/goods.js var mongoose = require('mongoose');//优先到node_modeles里加载 ...

  10. jfreechart,pdf生成组件iText,jasper report报表组件及POI操作excel等在企业软件开发中常遇到的第三方应用

    熟悉WEB Service ,Ajax,DWR,JQuery,iBatis等技术,熟练TOMCAT,IIS,JBoss,WebLogic等服务器 图表组件JFreeChart PDF组件-iText的 ...