У меня есть два угловых компонента app-image-input и app-button. Я использую app-button в шаблоне для ввода app-image следующим образом.
AppButtonComponent
appButton.html
<button type="button" (click)="buttonClicked.emit()">{{label}}</button>
appButton.ts
@Component({
selector: 'app-button',
templateUrl: './appButton.html'
})
export class AppButtonComponent {
@Input()
label : string
@Input()
enabled : boolean
@Output()
buttonClicked = new EventEmitter()
}
AppImageInputComponent
appImageInput.html
<div class="take-photo">
<span>Photo</span><input type="file" accept="image/*" capture>
</div>
<hr class="hr">
<div class="inner">
<app-button class="submit" label="Submit" (buttonClicked)="submitClk()"></app-button>
<app-button label="Cancel" (buttonClicked)="cancelClk()"></app-button>
</div>
AppModule
app.module.ts
// ..... imports go here.
@NgModule({
declarations: [AppButtonComponent, AppImageInputComponent],
entryComponents: [AppButtonComponent, AppImageInputComponent],
imports: [
FormsModule,
BrowserModule,
],
providers: [],
bootstrap: []
})
export class AppModule {
ngDoBootstrap() {
}
constructor(injector: Injector) {
Array.from(new Map<Type<any>, string>([
[AppButtonComponent, 'app-button'],
[AppImageInputComponent, 'app-image-input'],
]), ([key, value]) => {
customElements.define(value, createCustomElement(key, {injector}))
})
}
}
Задача
Я упаковываю свое приложение как угловые элементы и использую его в приложении HTML / JS. Странное поведение, с которым я сталкиваюсь, связано с тем, как я использую свой компонент ввода изображений.
Если я сделаю следующее, я получу компонент изображения, как и ожидалось.
<body>
<app-image-input></app-image-input>
</body>
</html>
Однако, когда я делаю следующее, кнопки дублируются.
<body>
<script>
setTimeout(() => {
var elem = document.createElement("app-image-input");
document.body.appendChild(elem);
}, 1000);
</script>
</body>
</html>
Обратите внимание, что установка времени ожидания около 400 (вместо 1000) миллисекунд дает правильный вывод !!
Вы можете найти полный проект здесь .
Также https://stackblitz.com/edit/angular-4mgv3c благодаря Карамириэль