详解Angular中自定义创建指令的方法

本篇文章给大家介绍一下在 Angular 中如何自定义创建指令。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。

指令介绍

在 Angular 中有三种类型的指令:

  • 组件,有模板的指令,组件是继承于指令的,只是扩展类与 UI 相关的属性

  • 属性型指令,改变 DOM 元素、组件或其他指令的行为和外观的指令。如,NgStyle、NgClass。

  • 结构型指令,通过添加或移除 DOM 元素改变 DOM 布局的指令。如,NgIf、NgFor。

然而,在实际的开发中,根据业务的需要,我们经常会拓展 Angular 组件的指令来方便业务的开发。下面让我们来看看如何创建自己的指令。【相关推荐:《angular教程》】

创建属性型指令

在 Angular 中,属性型指令的创建至少需要一个带有 @Directive 装饰器的控制器类。这个装饰器指定了一个选择器名称,用于标识与指令相关联的属性名称。控制器类实现了指令的功能行为。

接下来,我们创建一个简单的指令,实现鼠标在元素上悬停时,改变起背景颜色;鼠标移开时,背景颜色消失;鼠标点击时,字体变大;鼠标松开时,字体恢复原样的功能

指令实现

创建 background-exed.directive.ts 文件,实现如下代码

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

@Directive({
  selector: '[appBackgroundExe]'
})
export class BackgroundExeDirective {

  @Input('appBackgroundExe')
  highLightColor: string;

  constructor(private elementRef: ElementRef, private renderer: Renderer2) {
    // 这种写法比较丑陋
    // this.elementRef.nativeElement.style.background = 'yellow';
    // 推荐这种写法, Renderer
    this.renderer.setStyle(this.elementRef.nativeElement, 'background', 'yellow');
  }

  @HostBinding('class.pressed')
  ispressed: boolean;

  @HostListener('mouseenter')
  onMouseEnter(): void {
   this.highLight(this.highLightColor);
  }

  @HostListener('mouseleave')
  onMouseLeave(): void {
    this.highLight(null);
  }

  @HostListener('mousedown')
  onMouseDown(): void {
    this.ispressed = true;
  }

  @HostListener('mouseup')
  onmouseup(): void {
    this.ispressed = false;
  }

  private highLight(color: string): void {
    // this.elementRef.nativeElement.style.background = color;
    this.renderer.setStyle(this.elementRef.nativeElement, 'background', color);
  }

}

其中,selector: '[appBackgroundExe]' 是指令关联的属性名称,以便 Angular 在编译时,能从模板中找到与此指令关联的 HTML 代码

构造函数中,注入了 ElementRefRenderer2 模块的实例。通过 ElementRef 我们可以引用指令标识的 DOM 元素,并对其进行相关的操作;并且可以利用 Renderer2 提供的 API 对元素进行相关的渲染操作。

@HostListener@HostBinding属性装饰器。@HostListener 是用来为宿主元素添加事件监听;而指令标记的元素,就是宿主元素。@HostBinding 是用来动态设置宿主元素的属性值。

设置字体样式

  • appliation.component.less
.pressed {
  font-size: 30px;
}

在模板中使用指令

  • application.component.html
<div class=panel panel-primary>
  <div [appBackgroundExe]='red'>鼠标移进,元素变成红色。鼠标移出,元素红色消失</div>
</div>

创建结构型指令

结构型指令的创建与属性型指令创建大同小异。

指令实现

import { Directive, Input, TemplateRef, ViewContainerRef } from '@angular/core';

@Directive({
    selector: '[appIf]'
})
export class IfDirective {

    constructor(
        private templateRef: TemplateRef<any>,
        private viewContainerRef: ViewContainerRef
    ) { }

    @Input('ifCreat') 
    set condition(condition: boolean) {
       if (condition) {
         this.viewContainerRef.createEmbeddedView(this.templateRef);
       } else {
         this.viewContainerRef.clear();
       }
    }
}

其中,TemplateRef 表示内嵌的 template 模板元素,通过它可以创建内嵌视图。ViewContainerRef 表示一个视图容器,可以添加一个或多个视图,通过它可以创建和管理基于 TemplateRef 实例的内嵌视图或组件视图。

在模板中使用指令

  • application.component.html
<div class=panel panel-primary>
  <div *ifCreate='true'>hello</div>
</div>

小结

本文主要介绍了在 Angular 中如何自定义创建指令。在实际的开发中,我们可以很灵活地创建我们想要的指令。

更多编程相关知识,请访问:编程教学!!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


什么是深拷贝与浅拷贝?深拷贝与浅拷贝是js中处理对象或数据复制操作的两种方式。‌在聊深浅拷贝之前咱得了解一下js中的两种数据类型:
前言 今天复习了一些前端算法题,写到一两道比较有意思的题:重建二叉树、反向输出链表每个节点 题目 重建二叉树: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列 {1,2,4,7,3,5,6,8} 和中序遍历序列 {
最近在看回JavaScript的面试题,this 指向问题是入坑前端必须了解的知识点,现在迎来了ES6+的时代,因为箭头函数的出现,所以感觉有必要对 this 问题梳理一下,所以刚好总结一下JavaScript中this指向的问题。
js如何实现弹出form提交表单?(图文+视频)
js怎么获取复选框选中的值
js如何实现倒计时跳转页面
如何用js控制图片放大缩小
JS怎么获取当前时间戳
JS如何判断对象是否为数组
JS怎么获取图片当前宽高
JS对象如何转为json格式字符串
JS怎么获取图片原始宽高
怎么在click事件中调用多个js函数
js如何往数组中添加新元素
js如何拆分字符串
JS怎么对数组内元素进行求和
JS如何判断屏幕大小
js怎么解析json数据
js如何实时获取浏览器窗口大小
原生JS实现别踩白块小游戏(五)