gpt4 book ai didi

javascript - Angular 2 独立组件

转载 作者:太空狗 更新时间:2023-10-29 18:26:06 29 4
gpt4 key购买 nike

最近刚转到 Angular 2,我只是想了解它的几乎所有内容。

我需要构建并且只使用独立组件,我希望能够按如下方式使用我的组件。

<body>
<component-one></component-one>
<component-two></component-two>
</body>

就让这些组件在页面上呈现而言,问题是当这些组件选择器之一不存在于当前页面上时,我收到以下控制台错误...

core.umd.js:2838 EXCEPTION: Error in :0:0 caused by: The selector "component-one" did not match any elements

有没有办法只引导相关组件?

此外,“Angular 2 正在开发模式下运行。调用 enableProdMode() 以启用生产模式。”控制台消息会多次出现,具体取决于我在页面上有多少个组件,这让我觉得我错过了什么。

模块配置

// Modules
import { NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';

// Components
import { ComponentOne } from './components/componentOne';
import { ComponentTwo } from './components/componentTwo';


@NgModule({
imports: [ BrowserModule ],
declarations: [ ComponentOne, ComponentTwo ],
bootstrap: [ ComponentOne, ComponentTwo],
schemas: [ CUSTOM_ELEMENTS_SCHEMA ]
})
export class AppModule {
constructor() {

}

最佳答案

您可以省略 Bootstrap 选项并自己实现 ngDoBootstrap()。要有条件地引导组件,只需在调用 appRef.bootstrap(SomeComponent); 之前执行 querySelector 以检查组件是否已在页面上。

@NgModule({
imports: [ BrowserModule ],
declarations: [ ComponentOne, ComponentTwo ],
entryComponents: [ ComponentOne, ComponentTwo ]
})
export class AppModule {
ngDoBootstrap(appRef: ApplicationRef) {
if(document.querySelector('component-one')) {
appRef.bootstrap(ComponentOne);
}
if(document.querySelector('component-two')) {
appRef.bootstrap(ComponentTwo);
}
}
}

注意: entryComponents 选项是必需的

最后在您的 index.html 中您可以省略第二个标签并且 Angular 不会引发错误:

<body>
<component-one></component-one>
</body>

Plunker Example

如果您不想看到消息 Angular 2 正在开发模式下运行。调用 enableProdMode() 以启用生产模式。您可以只启用生产模式或使用与上述类似的以下(自 2.3.0 起)(我建议使用第一种解决方案 ):

@NgModule({
imports: [ BrowserModule ],
declarations: [ ComponentOne, ComponentTwo ],
entryComponents: [ComponentOne, ComponentTwo]
})
export class AppModule {
constructor(private resolver: ComponentFactoryResolver, private inj: Injector) {}

ngDoBootstrap(appRef: ApplicationRef) {
if(document.querySelector('component-one')) {
const compFactory = this.resolver.resolveComponentFactory(ComponentOne);
let compOneRef = compFactory.create(this.inj, [], 'component-one');
appRef.attachView(compOneRef.hostView);
compOneRef.onDestroy(() => {
appRef.detachView(compOneRef.hostView);
});
}
if(document.querySelector('component-two')) {
const compFactory = this.resolver.resolveComponentFactory(ComponentTwo);
let compTwoRef = compFactory.create(this.inj, [], 'component-one');
appRef.attachView(compTwoRef.hostView);
compTwoRef.onDestroy(() => {
appRef.detachView(compTwoRef.hostView);
});
}

appRef.tick();
}
}

这和 Angular 在引导组件时在内部所做的是一样的

Plunker Example

另见

关于javascript - Angular 2 独立组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41118925/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com