• Angular 指令介绍及使用(三)


    Angular 指令概述

    在 Angular 中,指令是一种机制,用于扩展和修改组件的行为和外观。指令可以由开发者自定义,也可以是 Angular 框架自带的一些内置指令。通过使用指令,我们可以在 HTML 模板中通过属性或元素名来操作组件。

    Angular 中的指令主要分为三种类型:

    • 组件指令(Component Directives)

    组件指令是一种带有模板的指令,它们代表了可重用的 UI 组件。组件指令通过使用 @Component 装饰器来定义,并使用 selector 属性指定了该组件指令在 HTML 模板中的使用方式。
    Angular的组件指令主要有组件装饰器 @Component。举例如下:

    @Component:

    下面是@Component指令的一个例子:

    import { Component } from '@angular/core';  
      
    @Component({  
      selector: 'app-example',  
      template: '

    Hello, World!

    '
    }) export class ExampleComponent { }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这个例子中,@Component装饰器接受一个元数据对象,其中包含了这个组件的一些基本属性。selector属性定义了如何在HTML模板中使用这个组件,这里我们把它定义为app-example。template属性定义了组件的HTML模板,这里我们简单地显示一个标题。

    除了这些,@Component装饰器还可以接受很多其它元数据,如styles、providers等,这些都是用来帮助定义和配置Angular组件的。

    • 结构型指令(Structural Directives)

    结构型指令用于根据条件动态操作元素或元素集合的结构。常见的结构型指令有 *ngIf、*ngFor、*ngSwitch 等。它们通过改变 DOM 结构来控制元素的显示或隐藏、复制或删除等操作。

    • 属性型指令(Attribute Directives)

    属性型指令用于修改元素的外观或行为,例如修改元素的样式或增加/删除元素的属性。内置的属性型指令包括 ngClass、ngStyle、ngModel 等。

    Angular 指令特点

    Angular 中的指令具有以下特点:

    指令是组件的基础:在 Angular 中,组件本质上是带有模板和一些行为的指令。因此,组件指令是 Angular 中最常用和重要的指令之一。

    指令可以扩展和修改现有的组件和 HTML 元素:通过使用指令,我们可以在现有的组件和 HTML 元素上扩展新的行为和功能。例如,我们可以创建一个指令来让某个元素支持拖拽操作。

    指令提供了可重用的组件和功能:通过使用指令,我们可以将某些组件或功能封装成可重用的指令,以便在多个项目中重复使用。这样可以提高代码的可维护性和可重用性。

    指令可以通过 DOM 操作来实现各种效果:通过使用指令,我们可以在 DOM 中动态地添加、删除或修改元素和属性,从而实现特定的效果。

    指令可以与服务和其他指令进行交互:指令可以依赖其他的指令或服务,从而实现更复杂的交互和功能。

    指令具有丰富的声明周期:指令有多个生命周期钩子,可以在指令的创建、更新和销毁等不同阶段执行不同的逻辑。这些生命周期钩子提供了更丰富的指令控制和扩展能力。

    Angular 常用指令

    在Angular框架中,常见的指令类型包括结构型指令和属性型指令。

    结构型指令:

    ngIf:

    根据条件控制元素的显示与隐藏。

    <div *ngIf="showElement">显示的内容div>
    
    • 1
    ngFor:

    迭代一个集合,并为每个元素生成对应的DOM元素。

    <ul>
      <li *ngFor="let item of items">{{ item }}li>
    ul>
    
    • 1
    • 2
    • 3
    ngSwitch:

    根据条件显示不同的元素。

    <div [ngSwitch]="condition">
      <div *ngSwitchCase="1">条件1div>
      <div *ngSwitchCase="2">条件2div>
      <div *ngSwitchDefault>默认条件div>
    div>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    属性型指令:

    ngClass:

    根据条件动态添加和移除元素的CSS类。

    <div [ngClass]="{'highlight': isHighlighted, 'italic': isItalic}">文本内容div>
    
    • 1
    ngStyle:

    根据条件动态设置元素的内联样式。

    <div [ngStyle]="{'color': textColor, 'font-size.px': fontSize}">文本内容div>
    
    • 1
    ngModel:

    实现双向数据绑定,将表单控件的值与组件数据进行同步。

    <input [(ngModel)]="name" placeholder="姓名">
    
    • 1

    Angular 指令例子

    以下是一个详细的 Angular 指令的代码例子,展示了如何创建一个自定义指令,并与服务进行交互:

    创建自定义指令:

    import { Directive, ElementRef, Input, OnInit } from '@angular/core';
    import { MyService } from './my.service';
    
    @Directive({
      selector: '[myCustomDirective]'
    })
    export class MyCustomDirective implements OnInit {
      @Input() myCustomDirective: string;
    
      constructor(private elementRef: ElementRef, private myService: MyService) {}
    
      ngOnInit(): void {
        // 在指令初始化时执行的逻辑
        this.elementRef.nativeElement.style.backgroundColor = 'yellow';
        
        // 使用服务中的方法
        const result = this.myService.doSomething();
        console.log(result);
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    创建一个服务:

    import { Injectable } from '@angular/core';
    
    @Injectable()
    export class MyService {
      doSomething(): string {
        return 'Service method called.';
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在组件中使用指令:

    <div myCustomDirective="example">div>
    
    • 1

    这个例子中,我们创建了一个名为 myCustomDirective 的自定义指令,它会将匹配的元素的背景色设置为黄色,并在指令的 ngOnInit 生命周期钩子中调用了服务 MyService 的 doSomething 方法,并将结果打印到控制台。

    为了使用自定义指令,我们需要将其添加到 Angular 模块的 declarations 数组中,并确保相关的服务也被注入和提供。





    刚刚接触Angular,总结理论知识和简单例子,希望能帮助后来学习Angular的人。

    大鹏一日同风起 扶摇直上九万里

    诸位加油


    END
  • 相关阅读:
    ESP32基础应用之LVGL基础
    萝卜快跑:隐私与安全并重的无人驾驶之旅
    重新认识受控和非受控组件
    二分查找,查找第一个大于目标元素target所对应的下标-2300. 咒语和药水的成功对数
    Java自学网站--十几个网站的分析与评测
    前端--性能优化【上篇】--网络优化与页面渲染优化
    taro 微信小程序写滑动删除左滑
    模拟前端ADC芯片LH001-91
    http和https分别是什么?
    ShareSDK for Flutter
  • 原文地址:https://blog.csdn.net/qqq1994_0810/article/details/134400624