范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

Angular自定义指令Tooltip

  #头条创作挑战赛#
  本文同步本人掘金平台的文章:https://juejin.cn/post/7082241253819023397
  一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第3天,点击查看活动详情。
  Yeah,关注我的读者应该知道,上一篇文章了解 Angular 开发的内容,我们已经概览了 Angular 的相关内容。在自定义指令的部分,我们已经能够实现编写,但是,在实际场景中,我们还需要标准化的管理。
  Angular 是 Angular.js 的升版
  So,本文,我们就以 Tooltip 来讲解下自定义指令的内容。
  线上效果图,如下:
  目录结构
  在上一篇文章的实现的代码项目基础上,执行命令行:# 进入 directives 文件夹 $ cd directives  # 创建 tooltip 文件夹 $ mkdir tooltip  # 进入 tooltip 文件夹 $ cd tooltip  # 创建 tooltip 组件 $ ng generate component tooltip  # 创建 tooltip 指令 $ ng generate directive tooltip 复制代码
  执行完上面的命令行之后,你会得到 app/directive/tooltip 的文件目录结构如下:tooltip ├── tooltip                                           // tooltip 组件 │    ├── user-list.component.html                     // 页面骨架 │    ├── user-list.component.scss                     // 页面独有样式 │    ├── user-list.component.spec.ts                  // 测试文件 │    └── user-list.component.ts                       // javascript 文件 ├── tooltip.directive.spec.ts                         // 测试文件 └── tooltip.directive.ts                              // 指令文件 复制代码
  嗯,这里我将组件放在 tooltip 的同级,主要是方便管理。当然,这个因人而异,你可以放在公共组件 components 文件夹内。编写 tooltip 组件
  在 html 文件中,有: {{data.content}} 复制代码
  在样式文件 .scss 中,有:$black: #000000; $white: #ffffff; $caret-size: 6px; $tooltip-bg: transparentize($black, 0.25); // transparentize 是 sass 的语法 $grid-gutter-width: 30px; $body-bg-color: $white; $app-anim-time: 200ms; $app-anim-curve: ease-out; $std-border-radius: 5px; $zindex-max: 100;  // :host 伪类选择器,给组件元素本身设置样式 :host {   position: fixed;   padding: $grid-gutter-width/3 $grid-gutter-width/2;   background-color: $tooltip-bg;   color: $body-bg-color;   opacity: 0;   transition: all $app-anim-time $app-anim-curve;   text-align: center;   border-radius: $std-border-radius;   z-index: $zindex-max; }  .caret { // 脱字符   width: 0;   height: 0;   border-left: 6px solid transparent;   border-right: 6px solid transparent;   border-bottom: 6px solid $tooltip-bg;   position: absolute;   top: -$caret-size;   left: 50%;   margin-left: -$caret-size/2;   border-bottom-color: $tooltip-bg; } 复制代码
  嗯~,css 是一个神奇的东西,之后会安排一篇文章来讲解下 sass 相关的内容...
  然后,在 javascript 文件 tooltip.component.ts 内容如下:import {    Component,    ElementRef, // 元素指向   HostBinding,    OnDestroy,    OnInit  } from "@angular/core";  @Component({   selector: "app-tooltip", // 标识符,表明我这个组件叫做啥,这里是 app-tooltip   templateUrl: "./tooltip.component.html", // 本组件的骨架   styleUrls: ["./tooltip.component.scss"] // 本组件的私有样式 }) export class TooltipComponent implements OnInit {    public data: any; // 在 directive 上赋值   private displayTimeOut:any;    // 组件本身 host 绑定相关的装饰器   @HostBinding("style.top")  hostStyleTop!: string;   @HostBinding("style.left") hostStyleLeft!: string;   @HostBinding("style.opacity") hostStyleOpacity!: string;    constructor(     private elementRef: ElementRef   ) { }    ngOnInit(): void {     this.hostStyleTop = this.data.elementPosition.bottom + "px";      if(this.displayTimeOut) {       clearTimeout(this.displayTimeOut)     }      this.displayTimeOut = setTimeout((_: any) => {       // 这里计算 tooltip 距离左侧的距离,这里计算公式是:tooltip.left + 目标元素的.width - (tooltip.width/2)       this.hostStyleLeft = this.data.elementPosition.left + this.data.element.clientWidth / 2 - this.elementRef.nativeElement.clientWidth / 2 + "px"       this.hostStyleOpacity = "1";       this.hostStyleTop = this.data.elementPosition.bottom + 10 + "px"     }, 500)   }         // 组件销毁   ngOnDestroy() {     // 组件销毁后,清除定时器,防止内存泄露     if(this.displayTimeOut) {       clearTimeout(this.displayTimeOut)     }   } } 复制代码编写 tooltip 指令
  这是本文的重点,具体的说明,我在代码上标注出来~
  相关的文件 tooltip.directive.ts 内容如下:import {    ApplicationRef, // 全局性调用检测   ComponentFactoryResolver, // 创建组件对象   ComponentRef, // 组件实例的关联和指引,指向 ComponentFactory 创建的元素   Directive, ElementRef,    EmbeddedViewRef, // EmbeddedViewRef 继承于 ViewRef,用于表示模板元素中定义的 UI 元素。   HostListener, // DOM 事件监听   Injector, // 依赖注入   Input  } from "@angular/core";  import { TooltipComponent } from "./tooltip/tooltip.component";  @Directive({   selector: "[appTooltip]" }) export class TooltipDirective {   @Input("appTooltip") appTooltip!: string;    private componentRef!: ComponentRef;    // 获取目标元素的相关位置,比如 left, right, top, bottom   get elementPosition() {     return this.elementRef.nativeElement.getBoundingClientRect();    }    constructor(     protected elementRef: ElementRef,     protected appRef: ApplicationRef,     protected componentFactoryResolver: ComponentFactoryResolver,     protected injector: Injector   ) { }    // 创建 tooltip   protected createTooltip() {     this.componentRef = this.componentFactoryResolver       .resolveComponentFactory(TooltipComponent) // 绑定 tooltip 组件       .create(this.injector);      this.componentRef.instance.data = { // 绑定 data 数据       content: this.appTooltip,       element: this.elementRef.nativeElement,       elementPosition: this.elementPosition     }      this.appRef.attachView(this.componentRef.hostView); // 添加视图     const domElem = (this.componentRef.hostView as EmbeddedViewRef).rootNodes[0] as HTMLElement;     document.body.appendChild(domElem);   }      // 删除 tooltip   protected destroyTooltip() {     if(this.componentRef) {       this.appRef.detachView(this.componentRef.hostView); // 移除视图       this.componentRef.destroy();     }   }      // 监听鼠标移入   @HostListener("mouseover")   OnEnter() {     this.createTooltip();   }        // 监听鼠标移出   @HostListener("mouseout")   OnOut() {     this.destroyTooltip();   }  } 复制代码
  到这里,已经完成了 99% 的功能了,下面我们在页面上调用即可。页面上调用
  我们在 user-list.component.html 上添加下面的内容:

Jimmy 复制代码   TooltipDirective 这个指令我们已经在 app.module.ts 上进行声明,我们直接调用即可。目前的效果如下:   我们实现的 tooltip 是底部居中展示,也就是我们平常使用框架,比如 angular ant design 中 tooltip 的 bottom 属性。对于其他属性,读者感兴趣的话,可以进行扩展。   至此,我们可以很好的维护自己编写的指令文件了。   【完】✅


拿什么拯救你?NBA全明星周末!满怀期待而来,带着失望而走!也许是所有球迷观看完NBA全明星周末后的心情。而且不仅仅是球迷对于全明星周末失望,参与其中的球员主教练媒体都给出了不好的评价。凯尔特人双子星之一的杰伦布山西隐在街巷中的诗意和烟火气食品街平遥古城步行街柳巷一座城市的气质和性格藏在一条条街巷里,它们承载着往昔的记忆,见证着岁月的变迁。一条条特色街巷,兼具时光的记忆和市井风情,在这里,可以探寻原住民的生活,也可以(环境)春光无限好眼下,多地春花初绽,市民游客亲近自然,踏青赏春。2月19日,人们在安徽合肥市肥东县长临河镇巢香梅园内欣赏盛开的梅花(无人机照片)。新华社发(阮雪枫摄)2月19日,安徽淮南市民间艺人去另一个城市漫步(2)凤城河梅园旅游目的地泰兴古银杏森林公园,泰州,溱潼湿地公园,溱潼古镇行走时间2014。10行程自驾D1上午出发至泰兴古银杏森林公园全程约140公里2小时下午泰兴古银杏森林公园到泰州华尔街酒店国内折叠屏手机市场1月数据出炉,华为丢冠,绿厂首次登顶!虽然智能手机出货量萎靡不振,折叠屏手机却是继续冲冲冲,2022年国内市场折叠屏手机出货量为283万台,同比增长高达144。其中华为以47。4的市占率位列第一,比25名的合计市占率还射阳县康养产业根深叶茂人气旺现代快报讯(通讯员陈明吕鹏臻)今年是游客周先生与妻子第二次到射阳过年,入住的是射阳日月岛康养旅游度假区。每年12月份,两位老人便从上海出发来射阳过冬,直到次年春暖花开之时再回上海。A股明天(2月21日)大盘走势简析,大幅反弹,反转来了吗今天的A股在万众期待下,走出了放量大幅反弹的走势,涨的让人热血沸腾,场内很多人惊呼卖飞了!被洗出来了!今天的上涨,超出了我在周预判里说的3260点高点位置。随着场内的做多气氛回潮,陈戌源给李铁开税后800万年薪,跟不少本土教练表扬李铁的高情商直播吧2月20日讯李铁陈戌源接连被调查,足球报发文评价道,陈戌源纵容李铁,国字号管理终酿大祸。李铁在国家队上任后,中国足协对其工作的支持几乎达到了前所未有的地步,从以团结是铁作为国萧华季中锦标赛可能会让欧洲联赛或其他联盟的球队参与其中直播吧2月20日讯NBA总裁亚当萧华近日在全明星期间接受了媒体采访。谈到季中锦标赛,萧华透露,NBA有让欧洲联赛或其他联盟的一些球队参与到季中锦标赛的想法。他表示我们已经讨论了季中2月20日复盘指数行情特征明显券商获28亿主力资金净流入2月20日消息,指数今日强势反弹,沪指今年首次涨逾2,创指午后拉升翻红涨1。3,上证50指数大涨超2。7。板块方面,家电板块持续强势,券商保险板块走高,虚拟数字人AIGC概念等数字面试官限流算法有哪些?限流的实现算法有很多,但常见的限流算法有三种计数器算法漏桶算法和令牌桶算法。1。计数器算法计数器算法是在一定的时间间隔里,记录请求次数,当请求次数超过该时间限制时,就把计数器清零,
小米人事调整,王翔退休,卢伟冰成小米集团总裁提起小米大家不陌生,但要说提起小米大家想到的第一个人必然得是雷军吧,可以说完全是雷军的个人魅力将小米带到现在这个地步。以至于身边总有人说,有时候去看小米的发布会不是去看小米的新产品1955年,毛主席首次用特赦令救下一名女犯,总理她是全党的恩人文丨小志连着说编辑丨小志连着说1955年6月,毛主席竟为一名已被打入死牢的女子,破例发出特赦令,并主动作为她的担保人,就是为了将此女子保释出狱。事后,毛主席再次谈论起为何会写下这封亿万克服务器的里子到底有多强大?生活中,我们经常可以看到好面子的人,甚至为了所谓的面子,折了里子,一味地追求表面的富丽堂皇,却忘记提升内在的充盈,这本身是一件舍本逐末的事情。学会把面子放下,寻求内心的充实,才是生诗两首(作者七月晴)一流年一去流年一去,是苍老的容颜,还是平静了的心?似海底,沉淀的,越发坚韧飘走的,不再悲叹。沧海桑田,也总有不变的。岁月泛起涟漪,激起你我的猜想。走走停停,路边的鲜花上还有露水,也友商开始慌了?一加11跑分曝光,134万分成安卓最强旗舰随着骁龙8Gen2处理器的发布,各大厂商新一代旗舰机型也正陆续跟上,而这其中就包含一加机型到来的数字系列机型一加11。最近在网上就曝光出一张疑似一加11的安兔兔跑分图,图中显示一加如何霸榜热搜?骑手为何困在系统里?南都报告关注算法的秘密12月22日,由南都个人信息保护研究中心联合清华大学人工智能国际治理研究院人工智能治理研究中心(清华大学)主办的2022啄木鸟数据治理论坛在北京举行。南都人工智能伦理课题组在会上发不用充值解锁超级充电,华为Mate50Pro新版本来了曾经有一种软件,叫手机快充,顾名思义,它就是标榜能加快手机充电速度,其实卵用没有的流氓软件。这些软件的优点是没有优点,唯一的擅长是给用户推送营销广告,或者诱骗用户充值解锁超级充电这GPRS4GNBIOT无线通信模块的简单介绍一GPRS技术GPRS(GeneralPacketRadioService)是通用分组无线服务技术的简称,它上是GSM移动电话用户可用的一种移动数据业务,介于2G和3G之间的技术,联通智能固话,连接亲情与TA如果你在人手一部智能手机的今天,提到固定电话,人们的第一印象肯定是,那个东西不是老早就从家庭通讯当中淘汰了吗。当然这样想没错,因为现在真的很难找到还在使用固话的家庭。但是,现在也有我那双11还没到的货,让即时零售可爱起来了年关将近,你能想到自己居然连双11的货都还没收到吗?就今年这样荒诞的购物经历,让我和身边很多朋友忽然发现了新的宝藏购物攻略即时零售。就是最近,我已经用美团和饿了么买到了酒精蔬果N9全球气候变暖,我们能做什么?4个月,他减了250kg250kg,约等于500多个国际足联要求的标准足球重量。放在运动场上,足以堆成一座小山。不经意间,在00后大学生刘达曦的手机里,已经积攒了这么多重量。只不过这个重量指的不是足球,而