日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

本篇文章帶大家繼續(xù)angular的學(xué)習(xí),以Tooltip為例來了解一下自定義指令,希望對大家有所幫助!


Angular學(xué)習(xí)之以Tooltip為例了解自定義指令


在之前的文章中,我們已經(jīng)概覽了 Angular 的相關(guān)內(nèi)容。在自定義指令的部分,我們已經(jīng)能夠?qū)崿F(xiàn)編寫,但是,在實際場景中,我們還需要標(biāo)準(zhǔn)化的管理。

Angular 是 Angular.js 的升版。

So,本文,我們就以 Tooltip 來講解下自定義指令的內(nèi)容。

線上效果圖,如下:

Angular學(xué)習(xí)之以Tooltip為例了解自定義指令

目錄結(jié)構(gòu)

在上一篇文章的實現(xiàn)的代碼項目基礎(chǔ)上,執(zhí)行命令行:

# 進(jìn)入 directives 文件夾
$ cd directives
 
# 創(chuàng)建 tooltip 文件夾
$ mkdir tooltip
 
# 進(jìn)入 tooltip 文件夾
$ cd tooltip
 
# 創(chuàng)建 tooltip 組件
$ ng generate component tooltip
 
# 創(chuàng)建 tooltip 指令
$ ng generate directive tooltip

執(zhí)行完上面的命令行之后,你會得到 app/directive/tooltip 的文件目錄結(jié)構(gòu)如下:

tooltip
├── tooltip                                           // tooltip 組件
│    ├── user-list.component.html                     // 頁面骨架
│    ├── user-list.component.scss                     // 頁面獨(dú)有樣式
│    ├── user-list.component.spec.ts                  // 測試文件
│    └── user-list.component.ts                       // javascript 文件
├── tooltip.directive.spec.ts                         // 測試文件
└── tooltip.directive.ts                              // 指令文件

嗯,這里我將組件放在 tooltip 的同級,主要是方便管理。當(dāng)然,這個因人而異,你可以放在公共組件 components 文件夾內(nèi)。


編寫 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 偽類選擇器,給組件元素本身設(shè)置樣式
: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 相關(guān)的內(nèi)容...


然后,在 javascript 文件 tooltip.component.ts 內(nèi)容如下:

import { 
  Component, 
  ElementRef, // 元素指向
  HostBinding, 
  OnDestroy, 
  OnInit 
} from '@angular/core';
 
@Component({
  selector: 'app-tooltip', // 標(biāo)識符,表明我這個組件叫做啥,這里是 app-tooltip
  templateUrl: './tooltip.component.html', // 本組件的骨架
  styleUrls: ['./tooltip.component.scss'] // 本組件的私有樣式
})
export class TooltipComponent implements OnInit {
 
  public data: any; // 在 directive 上賦值
  private displayTimeOut:any;
 
  // 組件本身 host 綁定相關(guān)的裝飾器
  @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 距離左側(cè)的距離,這里計算公式是:tooltip.left + 目標(biāo)元素的.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() {
    // 組件銷毀后,清除定時器,防止內(nèi)存泄露
    if(this.displayTimeOut) {
      clearTimeout(this.displayTimeOut)
    }
  }
}


編寫 tooltip 指令

這是本文的重點,具體的說明,我在代碼上標(biāo)注出來~

相關(guān)的文件 tooltip.directive.ts 內(nèi)容如下:

import { 
  ApplicationRef, // 全局性調(diào)用檢測
  ComponentFactoryResolver, // 創(chuàng)建組件對象
  ComponentRef, // 組件實例的關(guān)聯(lián)和指引,指向 ComponentFactory 創(chuàng)建的元素
  Directive, ElementRef, 
  EmbeddedViewRef, // EmbeddedViewRef 繼承于 ViewRef,用于表示模板元素中定義的 UI 元素。
  HostListener, // DOM 事件監(jiān)聽
  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>;
 
  // 獲取目標(biāo)元素的相關(guān)位置,比如 left, right, top, bottom
  get elementPosition() {
    return this.elementRef.nativeElement.getBoundingClientRect(); 
  }
 
  constructor(
    protected elementRef: ElementRef,
    protected appRef: ApplicationRef,
    protected componentFactoryResolver: ComponentFactoryResolver,
    protected injector: Injector
  ) { }
 
  // 創(chuàng)建 tooltip
  protected createTooltip() {
    this.componentRef = this.componentFactoryResolver
      .resolveComponentFactory(TooltipComponent) // 綁定 tooltip 組件
      .create(this.injector);
 
    this.componentRef.instance.data = { // 綁定 data 數(shù)據(jù)
      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();
    }
  }
   
  // 監(jiān)聽鼠標(biāo)移入
  @HostListener('mouseover')
  OnEnter() {
    this.createTooltip();
  }
     
  // 監(jiān)聽鼠標(biāo)移出
  @HostListener('mouseout')
  OnOut() {
    this.destroyTooltip();
  }
 
}

到這里,已經(jīng)完成了 99% 的功能了,下面我們在頁面上調(diào)用即可。


頁面上調(diào)用

我們在 user-list.component.html 上添加下面的內(nèi)容:

<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 這個指令我們已經(jīng)在 app.module.ts 上進(jìn)行聲明,我們直接調(diào)用即可。目前的效果如下:


Angular學(xué)習(xí)之以Tooltip為例了解自定義指令

我們實現(xiàn)的 tooltip 是底部居中展示,也就是我們平常使用框架,比如 angular ant design 中 tooltip 的 bottom 屬性。對于其他屬性,讀者感興趣的話,可以進(jìn)行擴(kuò)展。

至此,我們可以很好的維護(hù)自己編寫的指令文件了。


分享到:
標(biāo)簽:Angular學(xué)習(xí) Tooltip自定義指令
用戶無頭像

網(wǎng)友整理

注冊時間:

網(wǎng)站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運(yùn)動步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績評定2018-06-03

通用課目體育訓(xùn)練成績評定