欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Angular通過指令動態(tài)添加組件問題

 更新時間:2018年07月09日 11:52:10   作者:Shapeying  
這篇文章主要介紹了Angular通過指令動態(tài)添加組件問題,文中通過寫一個小組件來簡單總結(jié)下,需要的朋友可以參考下

之前自己寫的公共組件,都是會先引入,需要調(diào)起的時候再通過service控制公共組件狀態(tài)、值、回調(diào)函數(shù)什么的。但是有一些場景不適合這種方式,還是動態(tài)添加組件更加好。通過寫過的一個小組件來總結(jié)下。

創(chuàng)建組件

  場景:鼠標移動到圖標上時,展示解釋性的說明文字。那就需要創(chuàng)建一個普通的tooltip組件。如下:

<aside class="hover-tip-wrapper">
 <span>{{tipText}}</span>
</aside>
import { Component, OnInit } from '@angular/core';
@Component({
 selector: 'app-hovertip',
 templateUrl: './hovertip.component.html',
 styleUrls: ['./hovertip.component.scss']
})
export class HovertipComponent implements OnInit {
 public tipText: string;
 constructor() { }
 ngOnInit() {
 }
}
.hover-tip-wrapper{
 width: max-content;
 position: absolute;
 height: 30px;
 line-height: 30px;
 bottom: calc(100% + 5px);
 right: calc( -10px - 100%);
 background-color: rgba(#000000,.8);
 padding: 0 5px;
 border-radius: 3px;
 &::after{
 content: '';
 position: absolute;
 height: 0;
 width: 0;
 border: 4px solid transparent;
 border-top-color: rgba(#000000,.8);
 left: 10px;
 top: 100%;
 }
 span {
 color: #ccc;
 font-size: 12px;
 }
}

  非常簡單的一個組件,tipText來接收需要展示的文字。

  需要注意的是,聲明組件的時候,除了需要添加到declarations中外,還記得要添加到entryComponents中。

entryComponents: [HovertipComponent],
declarations: [HovertipComponent, HovertipDirective]

  那entryComponents這個配置項是做什么的呢?看源碼注釋,大概意思就是:Angular會為此配置項中的組件創(chuàng)建一個ComponentFactory,并存放在ComponentFactoryResolver中。動態(tài)添加組件時,需要用到組件工廠,所以此配置是必不可少的。

創(chuàng)建指令

  通過指令為目標元素綁定事件,控制創(chuàng)建組件、傳遞tipText以及組件的銷毀。

import { Input , Directive , ViewContainerRef , ComponentRef, ComponentFactory, HostListener , ComponentFactoryResolver} from '@angular/core';
import { HovertipComponent } from './hovertip.component';
@Directive({
 selector: '[appHovertip]'
})
export class HovertipDirective {
 public hovertip: ComponentRef<HovertipComponent>;
 public factory: ComponentFactory<HovertipComponent>;
 constructor(
 private viewContainer: ViewContainerRef,
 private resolver: ComponentFactoryResolver
 ) {
 // 獲取對應的組件工廠
 this.factory = this.resolver.resolveComponentFactory(HovertipComponent);
 }
 @Input('appHovertip') tipText: string;
 
 // 綁定鼠標移入的事件
 @HostListener('mouseenter') onmouseenter() {
   // 清空所有的view 
   this.viewContainer.clear();
 // 創(chuàng)建組件
 this.hovertip = this.viewContainer.createComponent(this.factory);
 // 向組件實例傳遞參數(shù)
 this.hovertip.instance.tipText = this.tipText;
 }
 
 // 綁定鼠標移出時的事件
 @HostListener('mouseleave') onmouseleave() {
 if (this.hovertip) {
  // 組件銷毀
 this.hovertip.destroy();
 }
 }
}

  通過ViewContainerRef類來管理視圖,這里用到了創(chuàng)建組件。這個 專欄 解釋的挺清楚的。這里用到了以下兩個API,清除和創(chuàng)建。

  createComponent方法接受ComponentFactoty類,創(chuàng)建后返回的ComponentRef類,可以獲取到組件實例(instance),控制組件銷毀。

  大致思路是這樣的,先獲取到了HovertipComponent組件對于的componentFactory,監(jiān)聽鼠標移入事件,在觸發(fā)事件時,通過ViewContainerRef類來創(chuàng)建組件,存下返回的組件componentRef(獲取實例,銷毀組件時需要用到),向組件實例傳遞tipText。監(jiān)聽鼠標移出事件,在事件觸發(fā)時,銷毀組件。

使用

  在目標元素是綁定指令,同時傳遞tipText即可。

  可以正常的創(chuàng)建和銷毀。

總結(jié)

  開始做的時候,主要是對這幾個類比較懵,ViewContainerRef、ComponentRef、ComponentFactory、ComponentFactoryResolver等,看看源碼,查查資料,總會梳理清楚的。

參考資料:

http://www.dbjr.com.cn/article/114683.htm

http://www.dbjr.com.cn/article/112123.htm

相關(guān)文章

  • 使用Raygun來自動追蹤AngularJS中的異常

    使用Raygun來自動追蹤AngularJS中的異常

    這篇文章主要介紹了使用Raygun來自動追蹤AngularJS中的異常,AngularJS是一款高人氣的JavaScript庫,需要的朋友可以參考下
    2015-06-06
  • Angular 輸入框?qū)崿F(xiàn)自定義驗證功能

    Angular 輸入框?qū)崿F(xiàn)自定義驗證功能

    AngularJS 表單和控件可以驗證輸入的數(shù)據(jù)。本文給大家介紹Angular 輸入框?qū)崿F(xiàn)自定義驗證功能,非常不錯,具有參考借鑒價值,需要的朋友參考下
    2017-02-02
  • angularJs在多個控制器中共享服務數(shù)據(jù)的方法

    angularJs在多個控制器中共享服務數(shù)據(jù)的方法

    今天小編就為大家分享一篇angularJs在多個控制器中共享服務數(shù)據(jù)的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-09-09
  • AngularJS過濾器filter用法分析

    AngularJS過濾器filter用法分析

    這篇文章主要介紹了AngularJS過濾器filter用法,結(jié)合實例形式分析了過濾器filter的功能、分類、使用方法與相關(guān)注意事項,需要的朋友可以參考下
    2016-12-12
  • AngularJS入門教程之過濾器用法示例

    AngularJS入門教程之過濾器用法示例

    這篇文章主要介紹了AngularJS過濾器用法,結(jié)合實例形式簡單的分析了AngularJS過濾器的功能及基本用法,并舉例說明了自定義過濾器的實現(xiàn)技巧,需要的朋友可以參考下
    2016-11-11
  • AngularJS表達式講解及示例代碼

    AngularJS表達式講解及示例代碼

    本文主要講解AngularJS表達式,這里整理了相關(guān)資料和提供示例代碼以及實現(xiàn)效果圖,有需要的小伙伴可以參考下
    2016-08-08
  • 微信小程序?qū)崿F(xiàn)左右聯(lián)動的實戰(zhàn)記錄

    微信小程序?qū)崿F(xiàn)左右聯(lián)動的實戰(zhàn)記錄

    聯(lián)動菜單是大家在開發(fā)小程序經(jīng)常會遇到的一個功能,下面這篇文章主要給大家介紹了關(guān)于微信小程序?qū)崿F(xiàn)左右聯(lián)動的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學習學習吧
    2018-07-07
  • Angularjs注入攔截器實現(xiàn)Loading效果

    Angularjs注入攔截器實現(xiàn)Loading效果

    angularjs作為一個全ajax的框架,對于請求,如果頁面上不做任何操作的話,在結(jié)果反回來之前,頁面是沒有任何響應的,不像普通的HTTP請求,會有進度條之類
    2015-12-12
  • angular使用TweenMax動畫庫的問題和解決方法

    angular使用TweenMax動畫庫的問題和解決方法

    這篇文章主要給大家介紹了關(guān)于angular使用TweenMax的相關(guān)問題和解決方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03
  • 詳解Angular中$cacheFactory緩存的使用

    詳解Angular中$cacheFactory緩存的使用

    這篇文章主要介紹了Angular中$cacheFactory緩存的使用,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-08-08

最新評論