本篇文章带大家继续angular的学习 , 以Tooltip为例来了解一下自定义指令 , 希望对大家有所帮助!
文章插图
在之前的文章中 , 我们已经概览了
Angular
的相关内容 。 在自定义指令的部分 , 我们已经能够实现编写 , 但是 , 在实际场景中 , 我们还需要标准化的管理 。 Angular 是 Angular.js 的升版 。 【相关教程推荐:《angular教程》】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
文件中 , 有: <div class="caret"></div><div class="tooltip-content">{{data.content}}</div>在样式文件
.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
内容如下: 【Angular学习之以Tooltip为例了解自定义指令】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<TooltipComponent>; // 获取目标元素的相关位置 , 比如 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 = https://www.52zixue.com/zhanzhang/webqd/js/04/13/69689/{ // 绑定 data 数据 content: this.appTooltip, element: this.elementRef.nativeElement, elementPosition: this.elementPosition } this.appRef.attachView(this.componentRef.hostView); // 添加视图 const domElem = (this.componentRef.hostView as EmbeddedViewRef
推荐阅读
- 文案策划实习报告
- 微信撩妹聊天语音
- 如何学会自由泳的步骤 学自由泳
- 模仿能力好的孩子学习都不会差,你学到了吗?
- 学习电脑制表格文字怎么竖起来解决您的问题
- 让宝宝从小开始学习尊敬长辈
- 超简短暖心情话
- 新人如何学习网络营销 网络营销学什么内容
- 通过电影的文案写作套路,学习爆款卖货文案
- 数学学习手抄报边框设计