angular 官方文件寫到,為了啟動 angular 程式,必須在main.ts
檔案裡寫上如下**:
這行**platformbrowserdynamic()
是為了構造乙個platform
,angular 官方文件對platform
的定義是(譯者注:為清晰理解,platform
定義不翻譯):
@ngmodule()
bootstrap屬性通常包含用來啟動程式的元件(譯者注:即根元件),angular 會在 dom 中查詢並匹配到該啟動元件的選擇器,然後例項化該啟動元件。
angular 啟動過程隱含了你想要哪乙個元件去啟動程式,但是如果啟動程式的元件是在執行時才被定義的該怎麼辦呢?當你獲得該元件時,又該如何啟動程式呢?事實上這是個非常簡單的過程。
假設我們有a
和b
兩個元件,將編碼決定執行時使用哪乙個元件來啟動程式,首先讓我們定義這兩個元件吧:
import from '@angular/core';
@component()
export class acomponent {}
@component()
export class bcomponent {}
@ngmodule()
注意,這裡因為我們得自定義啟動程式,從而沒有在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
元件資訊):
如果此時執行程式會有如下錯誤: }
讓我們寫乙個自定義方法bootstraprootcomponent
來啟動根元件:
// name - name (selector) of the component to bootstrap
// define the possible bootstrap components
// with their selectors (html host elements)
// (譯者注:定義從服務端可能返回的啟動元件陣列)
const options = ;
// 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';
// and add it to the dom
// (譯者注:建立乙個 dom 元素)
const componentelement = document.createelement(name);
const component = options[name];}
先構建乙個fetch
方法來模擬http
請求,該請求會在 2 秒後返回b
元件選擇器即b-comp
字串:
function fetch(url) , 2000);
});}
fetch('url/to/fetch/component/name')
}}這裡我做了個 stackblitz demo 來驗證該解決方法。(譯者注:譯者把該作者 demo 中 angular 版本公升級到最新版本 5.2.9,可以檢視angular-bootstrap-process當然可以,你僅僅需要預編譯所有元件,並使用元件的工廠類來啟動程式:
import from './components.ngfactory.ts';
@ngmodule()
fetch('url/to/fetch/component/name')
} const options = ;
...
記住我們不需要在entrycomponents
屬性中註冊元件,因為我們已經有了元件的工廠類了,沒必要再通過 angular compiler 去編譯元件獲得元件工廠類了。(譯者注:components.ngfactory.ts
是由angular aot compiler生成的,最新 angular 版本 在 cli 裡隱藏了該資訊,在記憶體裡臨時生成***.factory.ts檔案,不像之前版本可以通過指令物理生成這中間臨時檔案,儲存在硬碟裡。) 如何友好的啟動Angular應用
angular應用的index.html會在文件當中寫入根元件,例如 直到angular初始化完成後 loading.字樣才會從頁面消失,並進入實際的應用。當然相比較一版空白著實還算優雅一點。然而乙個好的應用的體驗怎能這樣呢,有興趣的可以先看一下 ng alain 是如何友好的啟動angular的。...
如何手動啟動消防廣播 消防應急廣播應如何規範設定
消防應急廣播裝置 是指完整的消防應急廣播系統,通常包括 控制和指示裝置 聲頻功率放大器 傳聲器 揚聲器 廣播分配裝置 電源裝置等部分。是在火災或意外事故發生時通過控制功率放大器和揚聲器進行應急廣播的裝置,它的主要功能是向現場人員通報火災發生,指揮並引導現場人員疏散。基本功能 1 為了便於使用者使用和...
Apache 如何手動安裝為服務並啟動執行?
apache 在windows下作為服務執行的命令比較簡單,在進入cmd模式視窗後依次輸入下面的命令即可 1 安裝作為服務 httpd k install 2 啟動服務 net start apache2.2 3 停止服務 net stop apache2.2 4 解除安裝服務 httpd k un...