Я пытаюсь использовать компонент Angular в качестве пользовательского элемента, чтобы я мог динамически добавлять его в DOM, и он автоматически загружался, но мне также нужен этот компонент как часть шаблона другого компонента.
Я зарегистрировал компонент Description как пользовательский элемент, и он корректно загружается в любое время, когда я добавляю в dom следующее:
<app-description text="Some description text..."></app-description>
Но, если я хочу использовать этот компонент как частьшаблона компонента Header (с правильно установленным атрибутом descriptionText) У меня не отображается описание.Я использую это так:
<app-description text="{{descriptionText}}"></app-description>
Я также пытался:
<app-description [text]="descriptionText"></app-description>
и
<app-description text="descriptionText"></app-description>
, но я не получил ожидаемогорезультат в любом случае.
Итак, мой вопрос: есть ли способ определить угловой компонент как пользовательский элемент, а также иметь возможность включить его в шаблон любого углового компонента?
Редактировать: Я поместил console.log () внутри метода ngOnInit в компонентах Header и Description, и я получаю его в консоли:
Кажется, что компонент инициализируется два раза, а во втором текст имеет значение undefined?
Описание компонента:
@Component({
selector: 'app-description',
templateUrl: './description.component.html',
styleUrls: ['./description.component.css']
})
export class DescriptionComponent implements OnInit {
@Input() text: String;
constructor() {}
ngOnInit() {
console.log('text:', this.text)
}
}
Шаблон описания:
<div class="description">
<h3>{{ text }}</h3>
</div>
Компонент заголовка:
@Component({
selector: 'app-header',
templateUrl: './header.component.html',
styleUrls: ['./header.component.less']
})
export class HeaderComponent implements OnInit {
@Input() title: String;
@Input() subtitle: String;
@Input() descriptionText: String;
constructor() {}
ngOnInit() {
console.log('descriptionText:', this.descriptionText)
}
}
Шаблон заголовка:
<div class="header flex-container">
<h1>{{ title }}</h1>
<h2>{{ subtitle }}</h2>
{{descriptionText}} <!-- shown correctly! -->
<app-description text="{{descriptionText}}"></app-description>
</div>
Модуль:
@NgModule({
declarations: [
AppComponent,
HeaderComponent,
DescriptionComponent
],
imports: [
BrowserModule,
FormsModule
],
providers: [],
bootstrap: [],
entryComponents: [
AppComponent,
HeaderComponent,
DescriptionComponent
],
schemas : [
CUSTOM_ELEMENTS_SCHEMA
]
})
export class AppModule {
constructor(private injector: Injector) {
this.registerCustomElements();
}
ngDoBootstrap() {}
registerCustomElements() {
const HeaderElement = createCustomElement(HeaderComponent, {injector: this.injector});
customElements.define('app-header', HeaderElement);
const DescriptionElement = createCustomElement(DescriptionComponent, {injector: this.injector});
customElements.define('app-description', DescriptionElement);
}
}
Я использую угловые пользовательские элементы, представленные в Angular 6
Спасибо!