이 글은 툴팁을 예로 사용하여 angular를 계속 학습하는 데 도움이 될 것입니다. 모든 사람에게 도움이 되기를 바랍니다.
이전 글에서는 Angular
에 대한 개요를 설명했습니다. 사용자 지정 지침 부분에서는 이를 작성할 수 있었지만 실제 시나리오에서는 여전히 표준화된 관리가 필요합니다. 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
内容如下:
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 = { // 绑定 data 数据 content: this.appTooltip, element: this.elementRef.nativeElement, elementPosition: this.elementPosition } this.appRef.attachView(this.componentRef.hostView); // 添加视图 const domElem = (this.componentRef.hostView as EmbeddedViewRef<any>).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
上添加下面的内容:
<p style="margin-top: 100px;"> <!-- [appTooltip]="'Hello Jimmy'" 是重点 --> <span [appTooltip]="'Hello Jimmy'" style="margin-left: 200px; width: 160px; text-align: center; padding: 20px 0; display: inline-block; border: 1px solid #999;" >Jimmy</span> </p>
TooltipDirective
这个指令我们已经在 app.module.ts
上进行声明,我们直接调用即可。目前的效果如下:
我们实现的 tooltip
是底部居中展示,也就是我们平常使用框架,比如 angular ant design
中 tooltip
的 bottom
Angular는 Angular.js의 업그레이드 버전입니다. [관련 튜토리얼 추천: "그래서 이번 글에서는angular tutorial
"]
Tooltip
을 활용하여 커스텀 명령어의 내용을 설명하겠습니다. 다음과 같은 온라인 렌더링: 🎜🎜🎜🎜디렉터리 구조🎜🎜이전 기사에서 구현한 코드 프로젝트를 기반으로 명령줄을 실행합니다. 🎜rrreee🎜위 명령줄을 실행하면 다음과 같이 app/directive/tooltip
의 파일 디렉터리 구조를 얻게 됩니다. 🎜rrreee🎜글쎄, 여기서는 tooltip
에 구성 요소를 넣었습니다. 코드> 주로 관리의 편의를 위해 동일한 수준입니다. 물론, 이는 사람마다 다르므로 공용 구성 요소 comments
폴더에 넣을 수 있습니다. 🎜🎜툴팁 구성 요소 작성🎜🎜html
파일에는 다음이 있습니다. 🎜rrreee🎜In 스타일 .scss
파일에는 🎜rrreee🎜흠~,css
는 마법 같은 것입니다.를 설명하는 글을 정리하겠습니다. sass 나중에. rrreee🎜<strong><span style="font-size: 18px;">툴팁 지침 작성</span></strong>🎜🎜이 글의 초점은 코드에 구체적인 지침을 표시하겠습니다~🎜 🎜관련 파일 <code> tooltip.directive.ts
내용은 다음과 같습니다. 🎜rrreee🎜이제99%
기능이 완성되었습니다. 페이지에서. 🎜🎜페이지 호출🎜🎜user-list.comComponent.html
에 다음을 추가합니다. 내용: 🎜rrreee🎜TooltipDirective
app.module.ts
에 이 지시문을 선언했으며 직접 호출할 수 있습니다. 현재 효과는 다음과 같습니다: 🎜🎜🎜🎜저희가 구현한툴팁
은 하단 중앙 표시입니다. 즉,Angular Ant 디자인툴팁
과 같은 프레임워크를 일반적으로 사용합니다. /code> >하단 속성. 다른 속성의 경우 독자가 관심이 있으면 확장할 수 있습니다. 🎜🎜이 시점에서 우리가 작성한 지침 파일을 잘 유지할 수 있습니다. 🎜🎜더 많은 프로그래밍 관련 지식을 보려면 🎜프로그래밍 소개🎜를 방문하세요! ! 🎜
위 내용은 사용자 정의 지침을 이해하기 위해 툴팁을 예로 사용한 각도 학습의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!