Angular 自定义指令

阅读时长 7 分钟读完

在 Angular 中,指令(Directive)是一种能够扩展 HTML 元素或者属性的方式,可以让开发者在需要的时候添加新的行为或者样式,以及对元素进行数据绑定。除了 Angular 自带的指令外,我们还可以自定义指令以满足不同的需求,本文将会详细介绍如何自定义指令,并给出相应的实例代码。

自定义指令的基本概念

在开始编写自定义指令之前,我们需要了解指令的基本概念。在 Angular 中指令可以分成三种类型:组件(Component)、结构性指令和属性型指令。其中,组件作为 Angular 中的另一个核心概念,在后面会详细介绍,这里主要介绍结构性指令和属性型指令。

结构性指令

结构性指令是 Angular 中最常用的指令之一,它可以改变 HTML 的布局和结构。Angular 自带的 *ngIf 和 *ngFor 就是两个典型的结构性指令。在自定义指令时,我们可以通过指定 selector 为属性指令的方式来定义结构性指令,例如:

属性型指令

属性型指令通常用来修改元素的样式和行为,可以为某个 HTML 元素添加自定义的属性。Angular 自带的 [ngStyle] 和 [ngClass] 就是两个典型的属性型指令。在自定义指令时,我们可以通过指定 selector 为属性指令的方式来定义属性型指令,例如:

其中,el 表示当前元素的 ElementRef 对象,renderer 则可以用来直接操作 Dom 元素。

自定义结构性指令

在这个例子中,我们将会创建一个名为 myIfElse 的结构性指令,该指令可以实现类似于 *ngIf-else 的功能。

首先,在 app.module.ts 中导入并注册自定义指令:

-- -------------------- ---- -------
------ - ----------------- - ---- -------------------------
-----------
  ------------- -
    -------------
    -----------------
  --
  -------- -
    --------------
    -----------
  --
  ---------- ---
  ---------- --------------
--
------ ----- --------- - -

接着,我们在 my-if-else.directive.ts 文件中编写自定义指令:

-- -------------------- ---- -------
------ - ---------- ------ ------------ ---------------- - ---- ----------------

------------
    --------- -------------
--
------ ----- ----------------- -
  ------- ------- - ------

  ------------
    ------- ------------ -----------------
    ------- -------------- ----------------
  - --

  -------- --- ------------------- -------- -
    -- ---------- -- -------------- -
      --------------------------------------------------------
      ------------ - -----
    - ---- -- ----------- -- ------------- -
      ---------------------------
      ------------ - ------
    -
  -
-

在该指令中,我们通过 @Input 装饰器定义了 myIfElse 输入属性,该属性会被传入到 setter 方法中,并根据条件生成或者销毁模板,从而实现了类似于 *ngIf-else 的功能。

最后,在 app.component.html 文件中使用自定义指令:

自定义属性型指令

在这个例子中,我们将会创建一个名为 myHighlight 的属性型指令,该指令可以为元素添加一个指定的颜色高亮。

首先,在 app.module.ts 中导入并注册自定义指令:

-- -------------------- ---- -------
------ - -------------------- - ---- ---------------------------
-----------
  ------------- -
    -------------
    --------------------
  --
  -------- -
    --------------
    -----------
  --
  ---------- ---
  ---------- --------------
--
------ ----- --------- - -

接着,我们在 my-highlight.directive.ts 文件中编写自定义指令:

-- -------------------- ---- -------
------ - ---------- ----------- ------------- ------ --------- - ---- ----------------

------------
  --------- ---------------
--
------ ----- -------------------- -
  ------------------- --- ----------- ------- --------- ---------- --

  --------------------- --------------- -------

  --------------------------- -------------- -
    ---------------------------------- -- ----------
  -

  --------------------------- -------------- -
    ---------------------
  -

  ------- ---------------- ------ - ----- -
    --------------------------------------------- ------------------ -------
  -
-

在该指令中,我们首先通过 @Input 装饰器定义了 myHighlight 输入属性,之后又使用 @HostListener 装饰器为元素添加了鼠标进入和离开的监听事件,当监听到鼠标进入事件时,调用 highlight 方法来添加高亮样式。

最后,在 app.component.html 文件中使用自定义指令:

带参数的用法可以传递一个字符串表示高亮的颜色,这里是 'green',不带参数的用法表示使用默认值 'yellow'。

总结

本文介绍了如何在 Angular 中自定义指令,以及如何使用自定义指令实现结构性和属性型指令,给出了相应的示例代码。自定义指令的强大能力可以让我们更加方便灵活的操作 HTML 元素和属性,更好地实现业务需求。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/649947de48841e9894644523

纠错
反馈