• 技术文章 >web前端 >js教程

    深入浅析Angular中的类(class)装饰器

    青灯夜游青灯夜游2021-11-11 10:13:12转载53
    本篇文章带大家了解一下Angular中的5种类(class)装饰器,希望对大家有所帮助!

    angular共有5种类装饰器,表明每个类的用途,angular用何种方式解析它。

    1. NgModule

    把一个类标记为模块,并可以在这个类中配置这个模块中用到的数据。【相关教程推荐:《angular教程》】

    它支持做如下配置:(下同)

    1.1 imports

    导入本模块需要用到的模块,注意懒加载的模块不能导入,否则懒加载就没有作用了。

    1.2. declarations: Array<Type | any[]>

    声明组件、指令、管道,这三个统称为可申明对象。

    1.3. providers: []

    注册服务

    1.4 exports: Array<Type | any[]>

    其他模块若想使用本模块的组件、指令或管道,则需要将其抛出去。

    为啥要抛出去?angular规定可声明对象应该且只能属于一个 NgModule。

    1.5 entryComponents: []

    告诉 Angular 哪些是动态组件,Angular 都会为其创建一个 ComponentFactory,并将其保存到 ComponentFactoryResolver 中。

    若要写一个动态组件不仅要在这里加,还需要在declarations中申明。

    1.6 bootstrap:Array<Type | any[]>

    当该模块引导时需要进行引导的组件。列在这里的所有组件都会自动添加到 entryComponents 中。即路由链接到该模块时默认显示的组件。

    1.7 schemas: Array<SchemaMetadata | any[]>

    该 NgModule 中允许使用的声明元素的 schema(HTML 架构)。 元素和属性(无论是 Angular 组件还是指令)都必须声明在 schema 中。

    1.8 id: string

    当前 NgModule 在 getModuleFactory 中的名字或唯一标识符。 如果为 undefined,则该模块不会被注册进 getModuleFactory 中。

    1.9 jit: true

    如果为 true,则该模块将会被 AOT 编译器忽略,因此始终会使用 JIT 编译。

    2. Component

    一个装饰器,用于把某个类标记为 Angular 组件,并为它配置一些元数据,以决定该组件在运行期间该如何处理、实例化和使用。 组件是特殊的指令,它的一部分属性继承自 Directive 装饰器。

    2.1 selector: string

    css选择器名称, 可以是标签名、属性、class等,一般都是以标签来命名,具体见指令选择器部分。

    selector: 'mo-dir'在html中使用为 <mo-dir></mo-dir>
    也可以使用属性来定义, 如selector: '[mo-dir]'在html中使用为 <div mo-dir></div>

    2.2 template: string、templateUrl:string

    这两个同时只能用1个

    2.3 styles、styleUrls

    2.4 animations

    一个或多个动画 trigger() 调用,包含一些 state() 和 transition() 定义。

    2.5 providers

    服务可以在这里面注册就可以使用了

    2.6 changeDetection

    指定当前组件的变更检测策略。

    2.7 inputs: string[]

    组件传入的参数,相当于@Input。和@Input不同的是它是一个数组。

    @Component({
      selector: 'mo-dir',
      inputs: [id: 123],
      template: `
       {{ id }}
      `
    })
    class BankAccount {
      id: number;
    }

    inputs中的内容表示有个id属性,默认值是123。相当于@Input id: number = 123

    2.8 outputs:string[]

    事件输出,相当于@Output,和@Output不同的是它是一个数组。

    @Component({
      selector: 'mo-dir',
      outputs: [ 'idChange' ]
    })
    class ChildDir {
     idChange: EventEmitter<string> = new EventEmitter<string>();
    }

    相当于@output idChange: EventEmitter<string> = new EventEmitter<string>();

    3. Directive

    3.1 selector: string

    它是一个css选择器, 用于在模板中标记出该指令,并触发该指令的实例化。可使用下列形式之一

    @Directive({
      selector: 'mo',
    })
    <mo></mo>
    @Directive({
      selector: '.mo',
    })
    <div class=".mo"></div>
    @Directive({
      selector: '[mo]',
    })
    <div mo></div>
    @Directive({
      selector: '[type=text]',
    })
    <input type="text"></div>

    比如匹配有属性mo但是不包含class.foo

    @Directive({
      selector: 'div[mo]:not(.foo)',
    })
    <div mo class="foo"></div>
    
    <div mo></div>

    上述指令第一个不会被匹配到,第二个会被匹配到。

    可以同时写多个,如果匹配到其中一个即可,使用逗号隔开。

    @Directive({
      selector: '.foo, .bar',
    })
    <div class="foo"></div>
    <div class="bar></div>
    <div class="foo bar"></div>

    上述三个均会被添加上指令。

    3.2 inputs、outputs: string[]

    同组件

    3.3 providers

    将服务注入进来使用

    3.4 exportAs: string

    Take Advantage of the exportAs Property in Angular:

    https://netbasal.com/angular-2-take-advantage-of-the-exportas-property-81374ce24d26

    把指令以一个变量抛出去,供外部使用。

    比如写了一个指令来修改文本颜色

    @Directive({
     selector: '[changeColor]',
     exportAs: 'changeColor'
    })
    class ChangeColorDirective {
        
        toggleColor() {
            // 修改颜色的逻辑
        }
    }
    <p changeColor #changeColorRef="changeColor"></p>
    
    <button (click)="changeColorRef.toggleColor()"></button>

    指令通过属性[changeColor]获取到了p元素,之后通过exportAs把指令以changeColor变量抛了出去, 在html模板中以#changeColorRef接收指令实例,这时就可以用这个指令里的内容了。

    3.5 queries、host、jit

    官网讲得挺清楚:

    4. Injectable

    Injectable:

    https://angular.cn/api/core/Injectable

    @Injectable({
      providedIn: 'root',
    })

    5. pipe

    管道的作用是数据转换。

    5.1 name: string

    管道名称

    5.2 pure: boolean

    自定义一个管道:

    把名字和id传入到管道进行处理

    import { Pipe, PipeTransform } from '@angular/core';
    
    @Pipe({
      name: 'mo',
    })
    export class MoPipe implements PipeTransform {
      transform(name: string, id: number): any {
        // 对传进来的数组进行处理,再return出去
      }
    }
    @Component({
      selector: 'mo-dir',
      template: `
        <p>   {{ name | mo: id }} </span>
      `
    })
    class BankAccount {
        name: string = "deepthan"
        id:   number = 1;
    }

    更多用法更新于 github:

    https://github.com/deepthan/blog-angular

    更多编程相关知识,请访问:编程视频!!

    以上就是深入浅析Angular中的类(class)装饰器的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:掘金社区,如有侵犯,请联系admin@php.cn删除
    专题推荐:Angular 类装饰器
    上一篇:总结分享一些基于Node.js的前端面试题(附解析) 下一篇:jquery怎么控制字数多少
    大前端线上培训班

    相关文章推荐

    • 一文了解angular中的3种内容投影(单插槽、多插槽、有条件)• 浅析Angular中怎么导入本地JSON文件• Angular学习之路由守卫(Route Guards)浅析• 浅谈Angular中的预加载配置、懒加载配置• 什么是Angular cli?怎么使用?• 浅析如何基于脚手架配置 Angular 代理(proxy)

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网