Angular自定义装饰器

本文详细介绍了Angular中的自定义属性型和方法型装饰器,通过实例展示了如何使用smile装饰器修改类属性并添加对话框功能。理解并掌握这些技巧有助于提升Angular组件开发效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Angular装饰器说白了就是一个函数,是一个返回函数的函数
一、自定义属性型装饰器
1、属性型装饰器是作用于class类属性上的。下例自定义smile()装饰器

export function smile() {
    return (target:any,key:string) =>{
        let val = target[key];
        let getter=()=>{
            return val
        }
        let setter = (value:string) => {
                val = `😊${value}😊`
        }
        Object.defineProperty (target,key,{
            set: setter,
            get: getter,
            configurable:true
        })
    } 
}

在这里,补充一下Object.defineProperty的知识:
Object.key(),效果类似for…in ,遍历对象属性,返回一个由属性名组成的数组。
Object.defineProperty(obj,prop,descriptor)定义对象中新属性或修改原有的属性,obj:必填,目标对象。prop:必填,需定义或修改的属性的名字。descriptor:必填,目标属性所拥有的特性。以对象形式{}书写,value:设置属性的值,默认为undefined,writable:值是否可以重写。true|false默认为false。enumerable:目标属性是否可以被枚举。true|false默认为false。configurable:目标属性是否可以被删除或是否可以再次修改特性true|false,默认为false。
2、将装饰器作用于属性上

export class TreeComponent implements OnInit {

  constructor() { }

  ngOnInit() {
  }
  @smile() tree:string="哈哈"
  @smile() defaultCheckedKey = ['0-0', '0-0-0', '0-0-1']
}

效果
在这里插入图片描述
二、自定义方法型装饰器
方法型装饰器和属性型装饰器类似,定义时,需增加PropertyDescriptor类型传入。如下例,PropertyDescriptor.value表示注解的方法,先将它存入变量ori中。然后将想要在注解函数执行前要执行的函数赋值给PropertyDescriptor.value,当这个函数执行完毕后,再判断是否执行存入变量ori被注解的函数。

export function dialog(mess:string) {
    return (target: any, key: string,describle:PropertyDescriptor) => {
        let ori = describle.value;
        describle.value=function(...args:any){
            let allow = window.confirm(mess);
            if(allow){
                let result = ori.apply(this,args)
                return result
            }
            return null
        }
        return describle;
    }
}
export class TreeComponent implements OnInit {
  constructor() { }
  ngOnInit() {
  }
  @smile() tree:string="哈哈"
  @smile() defaultCheckedKey = ['0-0', '0-0-0', '0-0-1']
  @dialog("弹出对话框")
  sudu(){
    console.log("哈哈哈哈")
  }
}
  <button (click)="sudu()">点击我</button>

效果
点击确定,执行被注解函数,输出"哈哈哈哈"
在这里插入图片描述
在这里插入图片描述
点击取消,不执行被注解函数,什么也不输出
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值