Angular 6 - 来自共享模块的自定义组件未加载到应用模块的页面视图中
Angular 6 - Custom component from shared module not loaded in app module's page view
我正在创建一个 Angular 6 应用程序,我现在专注于创建在我的共享模块中创建的可重用组件,以便能够在与我的应用程序模块相关的多个视图中使用。我现在正在使用 ngBootstrap & i18nService 创建一个语言选择器组件,它将在多个页面中使用,其中之一将是登录页面。这是我到目前为止所做的:
我共享的模块定义:
import { NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
import { CommonModule } from '@angular/common';
// Shared components
import { LanguageSelectorComponent } from '@app/shared/language-selector/language-selector.component';
import { I18nService } from '@app/shared/i18n.service';
import { NgbModule } from '../../../node_modules/@ng-bootstrap/ng-bootstrap';
@NgModule({
imports: [
CommonModule,
NgbModule.forRoot(),
],
declarations: [
LoaderComponent,
LanguageSelectorComponent
],
schemas: [
CUSTOM_ELEMENTS_SCHEMA
],
exports: [
LoaderComponent,
LanguageSelectorComponent
]
})
export class SharedModule {
static forRoot() {
return {
ngModule: SharedModule,
providers: [I18nService]
};
}
}
我的登录模块定义:
import { NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
import { CommonModule } from '@angular/common';
import { ReactiveFormsModule } from '@angular/forms';
import { TranslateModule } from '@ngx-translate/core';
import { NgbModule } from '@ng-bootstrap/ng-bootstrap';
import { LoginRoutingModule } from '@app/pages/login/login-routing.module';
import { LoginComponent } from '@app/pages/login/login.component';
import { SharedModule, LanguageSelectorComponent } from '@app/shared';
@NgModule({
imports: [
CommonModule,
ReactiveFormsModule,
TranslateModule,
NgbModule,
LoginRoutingModule,
SharedModule
],
declarations: [
LoginComponent
],
entryComponents: [LanguageSelectorComponent],
schemas: [
CUSTOM_ELEMENTS_SCHEMA
],
})
export class LoginModule { }
我的自定义共享组件定义(应用语言选择器):
import { Component, Input, OnInit } from '@angular/core';
import { I18nService } from '@app/shared/i18n.service';
@Component({
selector: 'app-language-selector',
templateUrl: './language-selector.component.html',
styleUrls: ['./language-selector.component.scss']
})
export class LanguageSelectorComponent implements OnInit {
@Input() customClass: string;
@Input() customStyle = '';
@Input() customPlacement = '';
constructor(private i18nService: I18nService) {
}
setLanguage(language: string) {
this.i18nService.language = language;
}
get currentLanguage(): string {
return this.i18nService.language;
}
get languages(): string[] {
return this.i18nService.supportedLanguages;
}
ngOnInit() {
console.log('Language selector shared component loaded!');
}
}
将使用此可重复使用的登录模板代码部分:
<div class="login-container bg-light">
<div class="login-box">
<h1>{{'APP_NAME' | translate}}</h1>
<div>
<h6 class="d-inline-block">v{{version}}</h6>
<app-language-selector-component [customClass] = "'d-inline-block ml-3'">
</app-language-selector-component>
</div>
我在 Chrome 调试器控制台中看到组件相关文件已加载,但相关 app-language-selector 组件的 html 未加载,因此它仅显示为:
<app-login _nghost-c1=""><div _ngcontent-c1="" class="login-container bg-light">
<div _ngcontent-c1="" class="login-box">
<h1 _ngcontent-c1="">WindNetPro</h1>
<div _ngcontent-c1="">
<h6 _ngcontent-c1="" class="d-inline-block">v1.0.0-dev</h6>
<app-language-selector-component _ngcontent-c1="">
</app-language-selector-component>
</div>
我在这里错过了什么?是组件相关还是ngBootstrap相关?
非常感谢!
您的选择器是
selector: 'app-language-selector',
不是app-language-selector-component
<app-language-selector-component [customClass] = "'d-inline-block ml-3'">
因此它不会作为组件受到威胁,而是作为普通的 HTML 标记受到威胁。更改选择器或标记。
我正在创建一个 Angular 6 应用程序,我现在专注于创建在我的共享模块中创建的可重用组件,以便能够在与我的应用程序模块相关的多个视图中使用。我现在正在使用 ngBootstrap & i18nService 创建一个语言选择器组件,它将在多个页面中使用,其中之一将是登录页面。这是我到目前为止所做的:
我共享的模块定义:
import { NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
import { CommonModule } from '@angular/common';
// Shared components
import { LanguageSelectorComponent } from '@app/shared/language-selector/language-selector.component';
import { I18nService } from '@app/shared/i18n.service';
import { NgbModule } from '../../../node_modules/@ng-bootstrap/ng-bootstrap';
@NgModule({
imports: [
CommonModule,
NgbModule.forRoot(),
],
declarations: [
LoaderComponent,
LanguageSelectorComponent
],
schemas: [
CUSTOM_ELEMENTS_SCHEMA
],
exports: [
LoaderComponent,
LanguageSelectorComponent
]
})
export class SharedModule {
static forRoot() {
return {
ngModule: SharedModule,
providers: [I18nService]
};
}
}
我的登录模块定义:
import { NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
import { CommonModule } from '@angular/common';
import { ReactiveFormsModule } from '@angular/forms';
import { TranslateModule } from '@ngx-translate/core';
import { NgbModule } from '@ng-bootstrap/ng-bootstrap';
import { LoginRoutingModule } from '@app/pages/login/login-routing.module';
import { LoginComponent } from '@app/pages/login/login.component';
import { SharedModule, LanguageSelectorComponent } from '@app/shared';
@NgModule({
imports: [
CommonModule,
ReactiveFormsModule,
TranslateModule,
NgbModule,
LoginRoutingModule,
SharedModule
],
declarations: [
LoginComponent
],
entryComponents: [LanguageSelectorComponent],
schemas: [
CUSTOM_ELEMENTS_SCHEMA
],
})
export class LoginModule { }
我的自定义共享组件定义(应用语言选择器):
import { Component, Input, OnInit } from '@angular/core';
import { I18nService } from '@app/shared/i18n.service';
@Component({
selector: 'app-language-selector',
templateUrl: './language-selector.component.html',
styleUrls: ['./language-selector.component.scss']
})
export class LanguageSelectorComponent implements OnInit {
@Input() customClass: string;
@Input() customStyle = '';
@Input() customPlacement = '';
constructor(private i18nService: I18nService) {
}
setLanguage(language: string) {
this.i18nService.language = language;
}
get currentLanguage(): string {
return this.i18nService.language;
}
get languages(): string[] {
return this.i18nService.supportedLanguages;
}
ngOnInit() {
console.log('Language selector shared component loaded!');
}
}
将使用此可重复使用的登录模板代码部分:
<div class="login-container bg-light">
<div class="login-box">
<h1>{{'APP_NAME' | translate}}</h1>
<div>
<h6 class="d-inline-block">v{{version}}</h6>
<app-language-selector-component [customClass] = "'d-inline-block ml-3'">
</app-language-selector-component>
</div>
我在 Chrome 调试器控制台中看到组件相关文件已加载,但相关 app-language-selector 组件的 html 未加载,因此它仅显示为:
<app-login _nghost-c1=""><div _ngcontent-c1="" class="login-container bg-light">
<div _ngcontent-c1="" class="login-box">
<h1 _ngcontent-c1="">WindNetPro</h1>
<div _ngcontent-c1="">
<h6 _ngcontent-c1="" class="d-inline-block">v1.0.0-dev</h6>
<app-language-selector-component _ngcontent-c1="">
</app-language-selector-component>
</div>
我在这里错过了什么?是组件相关还是ngBootstrap相关?
非常感谢!
您的选择器是
selector: 'app-language-selector',
不是app-language-selector-component
<app-language-selector-component [customClass] = "'d-inline-block ml-3'">
因此它不会作为组件受到威胁,而是作为普通的 HTML 标记受到威胁。更改选择器或标记。