我需要使用组件my-app来初始化一个Angular应用程序,但问题是该组件存在于未在页面启动时加载的HTML模板中,因此我必须手动初始化,否则会出现错误并显示以下消息:
错误:选择器“my-app”没有匹配任何元素。
这是否可能?
document.createElement()
动态创建元素,然后使用appendChild()
附加,然后调用System.import()
来初始化应用程序。这假定所有必要的应用程序资产和SystemJS配置已经被加载:
HTML
<body>
<div id="app"></div>
<button type="button" id="foo">Click Me</button>
<script src="app.js"></script>
</body>
JS
(function() {
var button = document.getElementById('foo');
var container = document.getElementById('app');
button.addEventListener('click', function() {
var myApp = document.createElement('my-app');
myApp.textContent = 'Loading...';
container.appendChild(myApp);
System.import('app')
.catch(console.error.bind(console));
});
})();
@angular/cli
,这可能更加困难,因为生成的文件具有诸如main.97e5159ded9c783f627a.bundle.js
之类的标识符。以下是如何实现的方法。首先创建一个根应用程序模块,并在declarations
和entryComponents
中声明您的根组件。 不要将其添加到bootstrap
组件中。然后在模块类上定义ngDoBootstrap
方法,让Angular知道您将自己引导应用程序。在此方法内部获取对ApplicationRef
的引用,然后在时机成熟时,只需调用bootstrap
并传递AppComponent
类引用即可。以下是代码:
@NgModule({
imports: [BrowserModule],
declarations: [AppComponent],
entryComponents: [AppComponent]
})
export class AppModule {
ngDoBootstrap(app: ApplicationRef) {
// delay bootstrap by 3 seconds
setTimeout(() => {
app.bootstrap(AppComponent)
}, 3000);
}
}
bootstrapComponents
的bootstrappModule(AppModule);
调用时,Angular在幕后做了这件事情。