angular使用動態組件后屬性值_Angular動態加載組件

引言

有時候需要根據URL來渲染不同組件,我所指的是在同一個URL地址中根據參數的變化顯示不同的組件;這是利用Angular動態加載組件完成的,同時也會設法讓這部分動態組件也支持AOT。

動態加載組件

下面以一個Step組件為示例,完成一個3個步驟的示例展示,并且可以通過URL user?step=step-one 的變化顯示第N個步驟的內容。

1、resolveComponentFactory

首先,還是需要先創建動態加載組件模塊。

import { Component, Input, ViewContainerRef, ComponentFactoryResolver, OnDestroy, ComponentRef } from '@angular/core';

@Component({

selector: 'step',

template: ``

})

export class Step implements OnDestroy {

private currentComponent: ComponentRef;

constructor(private vcr: ViewContainerRef, private cfr: ComponentFactoryResolver) {}

@Input() set data(data: { component: any, inputs?: { [key: string]: any } } ) {

const compFactory = this.cfr.resolveComponentFactory(data.component);

const component = this.vcr.createComponent(compFactory);

if (data.inputs) {

for (let key in data.inputs) {

component.instance[key] = data.inputs[key];

}

}

this.destroy();

this.currentComponent = component;

}

destroy() {

if (this.currentComponent) {

this.currentComponent.destroy();

this.currentComponent = null;

}

}

ngOnDestroy(): void {

this.destroy();

}

}

拋開一銷毀動作不談的話,實際就兩行代碼:

let compFactory = this.cfr.resolveComponentFactory(this.comp);

利用 ComponentFactoryResolver 查找提供組件的 ComponentFactory,而后利用這個工廠來創建實際的組件。

this.compInstance = this.vcr.createComponent(compFactory);

這一切都非常簡單。

而對于一些基本的參數,是直接對組件實例進行賦值。

for (let key in data.inputs) {

component.instance[key] = data.inputs[key];

}

最后,還需要告訴Angular AOT編譯器為用戶動態組件提供工廠注冊,否則 ComponentFactoryResolver 會找不到它們,最簡單就是利用 NgModule.entryComponents 進行注冊。

@NgModule({

entryComponents: [ UserOneComponent, UserTwoComponent, UserThirdComponent ]

})

export class AppModule { }

但這樣其實還是挺奇怪的,entryComponents 本身可能還會存在其他組件。而動態加載組件本身是一個通用性非常強,因此,把它封裝成名曰 StepModule 挺有必要的,這樣的話,就可以創建一種看起來更舒服的方式。

@NgModule({

declarations: [ Step ],

exports: [ Step ]

})

export class StepModule {

static withComponents(components: any) {

return {

ngModule: StepModule,

providers: [

{ provide: ANALYZE_FOR_ENTRY_COMPONENTS, useValue: components, multi: true }

]

}

}

}

通過利用 ANALYZE_FOR_ENTRY_COMPONENTS 將多個組件以更友好的方式動態注冊至 entryComponents。

const COMPONENTS = [ ];

@NgModule({

declarations: [ ...COMPONENTS ],

imports: [

StepModule.withComponents([ ...COMPONENTS ])

]

})

export class AppModule { }

2、一個示例

有3個Step步驟的組件,分別為:

// user-one.component.ts

import { Component, OnDestroy, Input, Injector, EventEmitter, Output } from '@angular/core';

@Component({

selector: 'step-one',

template: `

Step One Component:params value: {{step}}

`

})

export class UserOneComponent implements OnDestroy {

private _step: string;

@Input()

set step(str: string) {

console.log('@Input step: ' + str);

this._step = str;

}

get step() {

return this._step;

}

ngOnInit() {

console.log('step one init');

}

ngOnDestroy(): void {

console.log('step one destroy');

}

}

user-two、user-third 略同,這里組件還需要進行注冊:

const STEPCOMPONENTS = [ UserOneComponent, UserTwoComponent, UserThirdComponent ];

@NgModule({

declarations: [ ...STEPCOMPONENTS ],

imports: [

StepModule.withComponents([ ...STEPCOMPONENTS ])

]

})

export class AppModule { }

這里沒有 entryComponents 字眼,而是為 StepModule 模塊幫助我們動態注冊。這樣至少看起來更內聚一點,而且并不會與其他 entryComponents 在一起,待東西越多越不舒服。

最后,還需要 UserComponent 組件來維護步驟容器,會根據 URL 參數的變化,利用 StepComponent 組件動態加載相應組件。

@Component({

selector: 'user',

template: ``

})

export class UserComponent {

constructor(private route: ActivatedRoute) {}

stepComp: any;

ngOnInit() {

this.route.queryParams.subscribe(params => {

const step = params['step'] || 'step-one';

// 組件與參數對應表

const compMaps = {

'step-one': { component: UserOneComponent, inputs: { step: step } },

'step-two': { component: UserTwoComponent },

'step-third': { component: UserThirdComponent },

};

this.stepComp = compMaps[step];

});

}

}

非常簡單的使用,而且又對AOT比較友好。

總結

文章里面一直都在提AOT,其實AOT是Angular為了提供速度與包大小而生的,按我們項目的經驗來看至少在包的大小可以減少到 40% 以上。

當然,如果你是用angular cli開發,那么,當你進行 ng build --prod 的時候,默認就已經開啟 AOT 編譯模式。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/455239.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/455239.shtml
英文地址,請注明出處:http://en.pswp.cn/news/455239.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

分治2--取余運算

分治2--取余運算 一、心得 二、題目和分析 題目描述 輸入b,p,k的值,求bp mod k的值。其中b,p,k*k為長整型數。輸入 三個整數,分別為b,p,k的值輸出 bp mod k樣例輸入 2 10 9樣例輸出 …

-mysql-鎖機制分為表級鎖和行級鎖

2019獨角獸企業重金招聘Python工程師標準>>> 聲明:本欄目所使用的素材都是凱哥學堂VIP學員所寫,學員有權匿名,對文章有最終解釋權;凱哥學堂旨在促進VIP學員互相學習的基礎上公開筆記。 mysql鎖機制分為表級鎖和行級鎖 …

tornado學習筆記day05-訪問數據庫

模板## 配置模板路徑 這個在之前我們已經配置好了,可以參考前面的文章 settings {# 就像upfile就沒有,你寫了也白扯template_path: os.path.join(BASE_DIR, "templates"), }渲染并返回給客戶端 使用render()方法 class HomeIndexHandler(RequestHandler):def ge…

pythonelectron桌面開發案例_使用Electron開發基于Node.js的桌面應用

最近小編在查看分享資料時,發現一個可以開發跨平臺桌面應用的框架——NW.js(原名:node-webkit)。正當小編興致勃勃的研究NW.js的時候,最基礎的安裝環節出了問題。無論用npm還是cnpm都無法完整下載所依賴的包(具體原因待考察)。鑒于此&#xf…

x264_param_t結構體參數分析

參考網上的一些資料,結合個人的理解,對x264中x264_param_t結構體作了初步的分析,不保證正確。對x264熟悉的朋友可以在這基礎上修改添加typedef struct x264_param_t{/* CPU 標志位 */unsigned int cpu;int i_threads; /* 并行編…

知識點總結

1、把一個類轉換成一個xml,首先,類名前需要加特性,[DataContract(Namespace "http://CYSoft.Services/AuthorizationObject")],[XmlRoot("Org")],里邊的名字為根節點的名字,對各個屬性…

tornado學習筆記day06-應用安全

應用安全 cookie 普通cookie 一般我們的用戶表中都有啥呢 你在購物的時候,加入購物車,讓你登錄,那你登錄之后,他怎么知道你登錄了呢 token 這個值是隨機的,存在cookie里面 設置 原型: 設置cookie 的方法 def set_cookie(self,name: str,value: Union[str, bytes],domai…

托福試卷真題_干貨解答考生疑惑,自考真題考過了還會在出嗎?

重視真題!重視真題!重視真題!重要的話要說三遍。想自考的你們一定要注意,對于歷年真題,從來都是“備考必做”的態度。做自考真題,除了可以讓自己盡快熟悉考試題型和考點外,還有什么好處呢&#…

x264 struct學習 1

x264_t 結構體維護著CODEC的諸多重要信息 其中成員frames是一個指示和控制幀編碼過程的結構。其中current是已經準備就緒可以編碼的幀,其類型已經確定;next是尚未確定類型的幀;unused用于回收不使用的frame結構體以備今后再次使用。 struct …

2016 ACM/ICPC Asia Regional Dalian Online

自己還是太菜,補題離不開題解。。。 但還是留個博客,萬一以后忘了。。。 1001 Different Circle Permutation Polya定理,第一次遇見,學習了一下。不旋轉的時候可以得到 f[i]f[i-1]f[i-2] 斐波那契數列,旋轉后就可以通過…

tornado學習筆記day07-同步與異步

同步 概念 同步就是按部就班的依次執行我們的代碼 進階 但是有些情況我們有一些比較耗時的從操作,比如去別的地方拿點資源,去其他網站請求數據,去訪問數據庫,上傳文件等等,所以這里面優點瑕疵,有小編一一道來 比如這樣 本模塊的功能:<同步異步demo># 這個就相等于一個…

關鍵字: on

關鍵字: on 數據庫在通過連接兩張或多張表來返回記錄時&#xff0c;都會生成一張中間的臨時表&#xff0c;然后再將這張臨時表返回給用戶。 在使用left jion時&#xff0c;on和where條件的區別如下&#xff1a; 1、 on條件是在生成臨時表時使用的條件&#xff0c;它不管on中的條…

天融信安全接入客戶端_天融信提示您警惕物聯網設備Ripple20漏洞風險

近日&#xff0c;天融信阿爾法實驗室在JSOF實驗室發布的由Treck公司開發的TCP/IP軟件庫中獲取到一系列0day漏洞。JSOF實驗室發布的這批漏洞共計19個&#xff0c;被JSOF研究人員稱為"Ripple20"。受此軟件庫影響的產品數量估計超過數億&#xff0c;其中包括智能家居設備…

Service-Oriented Architecture,SOA(轉)

http://blog.csdn.net/WOOSHN/article/details/8036910 介紹&#xff1a; IT體系結構已非常成熟&#xff0c;它是一種成功處理典型IT問題的方法。體系結構中一個受到很大重視且相對較新的分支是面向服務的體系結構(SOA)。SOA經常被吹捧為企業用于解決應用程序靈活性和高維護成本…

tornado學習筆記day08-tornado中的異步

概述 應為epoll主要用來解決網絡的并發問題,所以tornado中的異步也是主要體現在網絡的IO異步上,即異步web請求 tornado.httpclient.AsyncHTTPClient tornado提供異步web請求客戶端,可以用來進行異步web請求, 這個客戶端和服務端是相對來說的,當tornado的Handler去其他位置去…

GreenSock (TweenMax) 動畫案例(二)

實現效果 動畫分解 1.燈光閃爍2.文字出現3.水流4.心電圖 知識點 1.AI(可盡情騷擾UI歐巴)2.SVG(了解基本的知識點)3.TweenMax(GreenSock)4.CSS animation 寫在前面 寫過第一篇文章后GreenSock (TweenMax) 動畫案例(一)再回頭看發現代碼太多&#xff0c;根本沒耐心去看完。所以每…

vue 用key拿對象value_利用 WeakMap 對 Vue 新建數組中的對象賦予 :key

需求在 Vue 中&#xff0c;對組件進行循環都需要加入key以便“就地復用”&#xff0c;可是在某些情況下&#xff0c;我們需要新建多個對象&#xff0c;而這些對象不是從后端獲取到的&#xff0c;而是前端生成的&#xff0c;沒有唯一值&#xff0c;且 Vue 目前版本只允許字符串&…

無限輪播圖片的實現原理

無限輪播圖相信是很多開發人員常用的一個功能&#xff0c;這里總結一下常用的兩種方式的實現原理 一、使用UIScrollview實現無限輪播用UIScrollView實現&#xff0c;在scrollView上添加3個UIImageView&#xff0c;分別用來顯示上一張圖片&#xff0c;當前顯示的圖片&#xff0c…

開啟 JM 的 trace 功能

[JM代碼] 開啟 JM 的 trace 功能本帖最后由 firstime 于 2009-6-15 11:16 AM 編輯 城里漢子說過&#xff1a; trace文件對分析碼流結構很有效。我說的是trace文件&#xff0c;不是一步一步跟蹤&#xff0c;就是編解碼同時生成的 trace_enc.txt 這個文件&#xff0c;里面對每個比…

kafka入門介紹(轉載)

Kafka作為一個分布式的流平臺&#xff0c;這到底意味著什么&#xff1f; 我們認為&#xff0c;一個流處理平臺具有三個關鍵能力&#xff1a; 發布和訂閱消息&#xff08;流&#xff09;&#xff0c;在這方面&#xff0c;它類似于一個消息隊列或企業消息系統。 以容錯的方式存儲…