日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

angular 指定components的路径_如何手动启动 Angular 程序

發布時間:2025/3/20 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 angular 指定components的路径_如何手动启动 Angular 程序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原文鏈接:How to manually bootstrap an Angular application ?blog.angularindepth.com

Angular 官方文檔寫到,為了啟動 Angular 程序,必須在 main.ts 文件里寫上如下代碼:

platformBrowserDynamic().bootstrapModule(AppModule);

這行代碼 platformBrowserDynamic() 是為了構造一個 platform,Angular 官方文檔對 platform 的定義是(譯者注:為清晰理解,platform 定義不翻譯):

the entry point for Angular on a web page. Each page has exactly one platform, and services (such as reflection) which are common to every Angular application running on the page are bound in its scope.

同時,Angular 也有 運行的程序實例(running application instance)的概念,你可以使用 ApplicationRef 標記(token)作為參數注入從而獲取其實例。上文的 platform 定義也隱含了一個 platform 可以擁有多個 application 對象,而每一個 application 對象是通過 bootstrapModule 構造出來的,構造方法就像上文 main.ts 文件中使用的那樣。所以,上文的 main.ts 文件中代碼,首先構造了一個 platform 對象和一個 application 對象。

譯者注:Platform->Application:Many Application->AppModule:bootstrapModule

當 application 對象被正在構造時,Angular 會去檢查模塊 AppModule 的 bootstrap 屬性,該模塊是用來啟動程序的:

@NgModule({imports: [BrowserModule],declarations: [AppComponent],bootstrap: [AppComponent] }) export class AppModule {}

bootstrap 屬性通常包含用來啟動程序的組件(譯者注:即根組件),Angular 會在 DOM 中查詢并匹配到該啟動組件的選擇器,然后實例化該啟動組件。

Angular 啟動過程隱含了你想要哪一個組件去啟動程序,但是如果啟動程序的組件是在運行時才被定義的該怎么辦呢?當你獲得該組件時,又該如何啟動程序呢?事實上這是個非常簡單的過程。

NgDoBootstrap

假設我們有 A 和 B 兩個組件,將編碼決定運行時使用哪一個組件來啟動程序,首先讓我們定義這兩個組件吧:

import { Component } from '@angular/core';@Component({selector: 'a-comp',template: `<span>I am A component</span>` }) export class AComponent {}@Component({selector: 'b-comp',template: `<span>I am B component</span>` }) export class BComponent {}

然后在 AppModule 中注冊這兩個組件:

@NgModule({imports: [BrowserModule],declarations: [AComponent, BComponent],entryComponents: [AComponent, BComponent] }) export class AppModule {}

注意,這里因為我們得自定義啟動程序,從而沒有在 bootstrap 屬性而是 entryComponents 屬性中注冊這兩個組件,并且通過在 entryComponents 注冊組件,Angular 編譯器(譯者注:Angular 提供了 @angular/compiler 包用來編譯我們寫的 angular 代碼,同時還提供了 @angular/compiler-cli CLI 工具)會為這兩個組件創建工廠類(譯者注:Angular Compiler 在編譯每一個組件時,會首先把該組件類轉換為對應的組件工廠類,即 a.component.ts 被編譯為 a.component.ngfactory.ts)。因為 Angular 會自動把在 bootstrap 屬性中注冊的組件自動加入入口組件列表,所以通常不需要把根組件注冊到 entryComponents 屬性中。(譯者注:即在 bootstrap 屬性中注冊的組件不需要在 entryComponents 中重復注冊)。

由于我們不知道 A 還是 B 組件會被使用,所以沒法在 index.html 中指定選擇器,所以 index.html 看起來只能這么寫(譯者注:我們不知道服務端返回的是 A 還是 B 組件信息):

<body><h1 id="status">Loading AppComponent content here ...</h1> </body>

如果此時運行程序會有如下錯誤:

The module AppModule was bootstrapped, but it does not declare “@NgModule.bootstrap” components nor a “ngDoBootstrap” method. Please define one of these

錯誤信息告訴我們, Angular 在向抱怨我們沒有指定具體使用哪一個組件來啟動程序,但是我們的確不能提前知道(譯者注:我們不知道服務端何時返回什么)。等會兒我們得手動在 AppModule 類中添加 ngDoBootstrap 方法來啟動程序:

export class AppModule {ngDoBootstrap(app) { } }

Angular 會把 ApplicationRef 作為參數傳給 ngDoBootstrap(譯者注:參考 Angular 源碼中這一行),等會準備啟動程序時,使用 ApplicationRef 的 bootstrap 方法初始化根組件。

讓我們寫一個自定義方法 bootstrapRootComponent 來啟動根組件:

// app - reference to the running application (ApplicationRef) // name - name (selector) of the component to bootstrap function bootstrapRootComponent(app, name) {// define the possible bootstrap components // with their selectors (html host elements)// (譯者注:定義從服務端可能返回的啟動組件數組)const options = {'a-comp': AComponent,'b-comp': BComponent};// obtain reference to the DOM element that shows status// and change the status to `Loaded` //(譯者注:改變 id 為 #status 的內容)const statusElement = document.querySelector('#status');statusElement.textContent = 'Loaded';// create DOM element for the component being bootstrapped// and add it to the DOM// (譯者注:創建一個 DOM 元素)const componentElement = document.createElement(name);document.body.appendChild(componentElement);// bootstrap the application with the selected componentconst component = options[name];app.bootstrap(component); // (譯者注:使用 bootstrap() 方法啟動組件) }

傳入該方法的參數是 ApplicationRef 和啟動組件的名稱,同時定義變量 options 來映射所有可能的啟動組件,并以組件選擇器作為 key,當我們從服務器中獲取所需要信息后,再根據該信息查詢是哪一個組件類。

先構建一個 fetch 方法來模擬 HTTP 請求,該請求會在 2 秒后返回 B 組件選擇器即 b-comp 字符串:

function fetch(url) {return new Promise((resolve) => {setTimeout(() => {resolve('b-comp');}, 2000);}); }

現在我們擁有 bootstrap 方法來啟動組件,在 AppModule 模塊的 ngDoBootstrap 方法中使用該啟動方法吧:

export class AppModule {ngDoBootstrap(app) {fetch('url/to/fetch/component/name').then((name)=>{ this.bootstrapRootComponent(app, name)});} }

這里我做了個 stackblitz demo 來驗證該解決方法。(譯者注:譯者把該作者 demo 中 angular 版本升級到最新版本 5.2.9,可以查看 angular-bootstrap-process,2 秒后會根據服務端返回信息自定義啟動 application)

在 AOT 中能工作么?

當然可以,你僅僅需要預編譯所有組件,并使用組件的工廠類來啟動程序:

import {AComponentNgFactory, BComponentNgFactory} from './components.ngfactory.ts'; @NgModule({imports: [BrowserModule],declarations: [AComponent, BComponent] }) export class AppModule {ngDoBootstrap(app) {fetch('url/to/fetch/component/name').then((name) => {this.bootstrapRootComponent(app, name);});}bootstrapRootComponent(app, name) {const options = {'a-comp': AComponentNgFactory,'b-comp': BComponentNgFactory};...

記住我們不需要在 entryComponents 屬性中注冊組件,因為我們已經有了組件的工廠類了,沒必要再通過 Angular Compiler 去編譯組件獲得組件工廠類了。(譯者注:components.ngfactory.ts 是由 Angular AOT Compiler 生成的,最新 Angular 版本 在 CLI 里隱藏了該信息,在內存里臨時生成 xxx.factory.ts 文件,不像之前版本可以通過指令物理生成這中間臨時文件,保存在硬盤里。)

總結

以上是生活随笔為你收集整理的angular 指定components的路径_如何手动启动 Angular 程序的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 成人免费毛片入口 | 久久久久亚洲av无码专区 | 日韩精品乱码 | 久久伊人色 | 国产com| 一区二区三区四区不卡 | 91美女视频网站 | 探花视频在线观看 | 日韩成人午夜影院 | 中文字幕 欧美激情 | 中国少妇初尝黑人巨大 | 精品国产成人亚洲午夜福利 | 欧产日产国产69 | 五月天一区二区三区 | 我爱52av | 国产精品美女高潮无套 | 老版水浒传83版免费播放 | 麻豆高清 | 欧美色精品在线 | 男人天堂视频在线观看 | 久久99深爱久久99精品 | 欧美日韩国产一区二区在线观看 | 免费观看毛片网站 | 亚洲欧美成人综合 | 日韩欧美高清在线 | 中文字幕一区二区三区人妻 | 国产精品国产三级国产aⅴ原创 | 老司机福利院 | 中文视频在线观看 | 亚州av免费 | 91人人干 | 色永久 | 女~淫辱の触手3d动漫 | 97中文字幕在线观看 | 中文字幕无码乱人伦 | 久久疯狂做爰流白浆xx | 欧美性一级片 | 欧美激情视频一区二区三区在线播放 | 日韩高清在线播放 | 台湾佬美性中文娱乐 | 黄色a在线观看 | 欧美图片一区二区三区 | 免费看av的网址 | 三级久久久 | 欧美亚洲在线播放 | 爱情岛论坛亚洲线路一 | 人妻av无码一区二区三区 | 国产视频一区二区在线播放 | 中文字幕av第一页 | 欧美婷婷六月丁香综合色 | 成人午夜视频在线免费观看 | 美女少妇直播 | 亚洲天天av | 这里只有精品视频在线观看 | 在线免费毛片 | 一区二区国产精品视频 | 色涩久久 | 国产精品成人3p一区二区三区 | 日本毛片网站 | 中文字幕亚洲色图 | 午夜草逼 | 亚色综合| 亚洲精品91天天久久人人 | 国产女主播在线一区二区 | 中文字幕在线观看二区 | 亚洲精品图区 | 第九色 | 日本黄色一级视频 | 善良的少妇伦理bd中字 | 久久国产视频网站 | 扒开女人屁股进去 | 国产精品久久久久av | 天堂在线中文字幕 | 爽爽影院免费观看 | 亚洲精品国偷拍自产在线观看蜜桃 | 国产日韩视频一区 | 五月婷婷导航 | 亚洲综合社区 | 精品在线99 | 国产黄视频网站 | 香蕉视频性 | 毛片无遮挡高清免费观看 | 日韩欧美成人一区二区 | 乌克兰极品av女神 | 天堂在线中文8 | 欧美a v在线播放 | 欧美高清一区二区三区四区 | 97人人干 | 森泽佳奈在线播放 | 国产毛茸茸 | 亚洲人午夜精品 | 六月婷婷综合网 | 日屁视频| 伊人久久久久久久久久久久 | 日韩综合 | 播放男人添女人下边视频 | 无码人中文字幕 | 欧美片17c07.com| 黄色成人在线 |