У меня есть обычное приложение Angular 10 с лениво загруженными модулями и маршрутизацией. Однако у меня есть особое требование, которое мне нужно выполнить.
На большинстве страниц я хочу инициализировать полное приложение с маршрутизацией и т. Д. Путем встраивания элемента <app-root>
в index.html, то есть AppComponent
. С другой стороны, на некоторых страницах необходимо инициализировать не все приложение, а только один конкретный <header-search>
компонент, который я зарегистрировал с помощью @ angular / elements (веб-компоненты). Это также означает, что в этом случае не должна выполняться ни маршрутизация, ни инициализировать какой-либо другой компонент, кроме <header-search>
(если он не внедряется самим компонентом <header-search>
).
Примечание для вас, чтобы вы понимали предысторию варианта использования: в проекте, который я создаю, не все части отделены от Angular. Некоторые страницы визуализируются на стороне сервера с использованием Twig / PHP. Но мне нужно, чтобы функция поиска в заголовке, созданная с помощью Angular, была доступна и на этих страницах. Это означает, что у меня не будет полного приложения, доступного одновременно, в данном случае только HeaderSearchComponent
. Однако на других страницах полное приложение будет инициализировано, включая HeaderSearchComponet
, поэтому нет необходимости в отдельном встраивании с использованием веб-компонентов - в этом случае достаточно элемента <app-root>
.
Мои мысли, где зарегистрировать пользовательский веб-компонент HeaderSearchComponent
как <header-search>
с использованием угловых элементов, таких как:
@NgModule({
imports: [BrowserModule, FormsModule, SharedModule],
declarations: [AppComponent],
bootstrap: [AppComponent],
entryComponents: [HeaderSearchComponent]
})
export class AppModule implements DoBootstrap {
constructor(injector: Injector) {
const webComponent = createCustomElement(HeaderSearchComponent, {
injector
});
customElements.define("header-search", webComponent);
}
public ngDoBootstrap(): void {}
}
После этого я смогу визуализировать HeaderSearchComponent
с помощью <header-search>
или полное приложение с помощью <app-root>
. Однако, как только я встраиваю только <header-search>
, не имея <app-root>
одновременно, Angular выдает ошибку:
Ошибка: селектор app-root не соответствует ни одному элементу
Вы можете попробовать это самостоятельно в следующем минимальном примере Stackblitz без сложной логики приложения или маршрутизации, заменив <app-root></app-root>
на <header-search></header-search>
в файле index.html
.
https://stackblitz.com/edit/angular-ivy-a4ulcc?file=src/index.html
Как уже упоминалось, мне нужен рабочий компонент <header-search>
без элемента <app-root>
. Но также должна быть возможность иметь элемент <app-root>
для всего приложения без присутствия компонента <header-search>
. Так что либо поиск по заголовку, либо корень приложения, оба должны работать.
Как иметь компонент настраиваемого элемента (в данном случае <header-search>
) в качестве точки входа и по-прежнему иметь возможность инициализировать полное приложение Angular с помощью элемента <app-root>
?