[英]Angular 8 - Dynamically added button.Click event not working
我正在尝试通过单击屏幕中的添加按钮添加产品图像并使用删除按钮删除。 这些应该在用户单击添加或删除按钮时动态加载。 但是当我动态注入 html 并绑定点击事件时,它不起作用。 单击它时,函数不会调用。 我已经简化了下面的代码。 HTML文件:
<div class="product_images">
<div class="imageHeading">
<p>
Images
</p>
</div>
<div class="kt-form__group">
<div class="row">
<div class="col-lg-2 imageLabel">Main Image</div>
<div class="col-lg-3 imageLabel">Choose Image</div>
<div class="col-lg-2 imageLabel">Image</div>
<div class="col-lg-2 imageLabel">Actions</div>
</div>
</div>
<div class="imagesContainer" [innerHtml]="containerToAdd | sanitizeHtml">
</div>
</div>
ts文件
// Angular
import { Component, OnInit, ElementRef, ViewChild, ChangeDetectionStrategy, OnDestroy, ChangeDetectorRef } from '@angular/core';
import { ActivatedRoute, Router } from '@angular/router';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
// Material
import { SelectionModel } from '@angular/cdk/collections';
import { MatPaginator, MatSort, MatSnackBar, MatDialog, MatRadioButton } from '@angular/material';
import { ProductManagementService } from '../../../../../core/e-commerce/_services/product-management.service';
import { ToastrService } from 'ngx-toastr';
import { ViewEncapsulation } from '@angular/core';
@Component({
selector: 'kt-product-edit',
templateUrl: './product-edit.component.html',
styleUrls: ['./product-edit.component.scss'],
encapsulation: ViewEncapsulation.None
})
export class ProductEditComponent implements OnInit {
previewUrl : any = "/assets/media/images/noimage.jpg";
containerToAdd : string = "";
constructor(
private products: ProductManagementService,
private router: Router,
private route: ActivatedRoute,
private toastr: ToastrService,
private cdr: ChangeDetectorRef,
private FB: FormBuilder,
) {
}
ngOnInit() {
this.addImage();
}
addImage(){
this.containerToAdd = `
"<div class="kt-form__group image-container container-1">
<div class="row">
<div class="col-lg-2"><input type="checkbox" /></div>
<div class="col-lg-3"><input type="file" accept="image/*" (change)="imagePreview($event)" /></div>
<div class="col-lg-2"><img [src]="previewUrl" class="prod_image" /></div>
<div class="col-lg-2">
<span class="deleteElement" (click)="deleteImage()">
Del
</span>
</div>
</div>
</div>"`;
}
deleteImage() {
console.log("deleteImage");
}
}
当我用那个点击事件点击那个跨度时,deleteImage() 函数没有调用。
您正在绑定到innerHtml,因此您用于绑定的html 中的任何角度语法都不起作用,因为它不是编译角度模板。 所以你的点击绑定无效。 一个简单的 *ngIf 应该不错。
<div class="product_images">
<div class="imageHeading">
<p>
Images
</p>
</div>
<div class="kt-form__group">
<div class="row">
<div class="col-lg-2 imageLabel">Main Image</div>
<div class="col-lg-3 imageLabel">Choose Image</div>
<div class="col-lg-2 imageLabel">Image</div>
<div class="col-lg-2 imageLabel">Actions</div>
</div>
</div>
<div class="imagesContainer" [innerHtml]="containerToAdd | sanitizeHtml">
<div class="kt-form__group image-container container-1" *ngIf="addImage">
<div class="row">
<div class="col-lg-2">
<input type="checkbox" />
</div>
<div class="col-lg-3">
<input type="file" accept="image/*" (change)="imagePreview($event)" />
</div>
<div class="col-lg-2"><img [src]="previewUrl" class="prod_image" /></div>
<div class="col-lg-2">
<span class="deleteElement" (click)="deleteImage()">
Del
</span>
</div>
</div>
</div>
</div>
</div>
export class MyComponent{
previewUrl : any = "/assets/media/images/noimage.jpg";
public addImage = false
constructor(
private products: ProductManagementService,
private router: Router,
private route: ActivatedRoute,
private toastr: ToastrService,
private cdr: ChangeDetectorRef,
private FB: FormBuilder) {
}
ngOnInit() {
this.addImage();
}
addImage(){
this.addImage = true;
}
deleteImage() {
this.addImage = false
console.log("deleteImage");
}
}
<div class="product_images">
<div class="imageHeading">
<p>
Images
</p>
</div>
<div class="kt-form__group">
<div class="row">
<div class="col-lg-2 imageLabel">Main Image</div>
<div class="col-lg-3 imageLabel">Choose Image</div>
<div class="col-lg-2 imageLabel">Image</div>
<div class="col-lg-2 imageLabel">Actions</div>
</div>
</div>
<div class="imagesContainer">
<div class="kt-form__group image-container container-1" *ngFor="let image of images; let index = i">
<div class="row">
<div class="col-lg-2">
<input type="checkbox" />
</div>
<div class="col-lg-3">
<input type="file" accept="image/*" (change)="imagePreview($event, image)" />
</div>
<div class="col-lg-2"><img [src]="previewUrl" class="prod_image" /></div>
<div class="col-lg-2">
<span class="deleteElement" (click)="deleteImage(i)">
Del
</span>
</div>
</div>
</div>
</div>
</div>
export class MyComponent{
previewUrl : any = "/assets/media/images/noimage.jpg";
public images = []
constructor(
private products: ProductManagementService,
private router: Router,
private route: ActivatedRoute,
private toastr: ToastrService,
private cdr: ChangeDetectorRef,
private FB: FormBuilder) {
}
ngOnInit() {
this.addImage();
}
addImage(){
this.images.push({});
}
deleteImage(index: number) {
this.images.splice(index, 1)
console.log("deleteImage");
}
imagePreview($event, image){
image.path = event.value;
}
}
我认为它有帮助,你会添加一些对你有利的代码:
html :
<div class="product_images">
<div class="imageHeading">
<p>
Images
</p>
</div>
<div class="kt-form__group">
<div class="row">
<div class="col-lg-2 imageLabel">Main Image</div>
<div class="col-lg-3 imageLabel">Choose Image</div>
<div class="col-lg-2 imageLabel">Image</div>
<div class="col-lg-2 imageLabel">Actions</div>
</div>
</div>
<div class="imagesContainer" #elementRef>
</div>
</div>
ts:
@ViewChild("elementRef", { static: true }) deletableItem: ElementRef<
HTMLDivElement
>;
containerToAdd: any;
previewUrl: any;
constructor(private sanitizer: DomSanitizer, private renderer: Renderer2) {}
ngOnInit() {
this.addImage();
}
ngAfterViewInit() {}
addImage() {
let span: HTMLSpanElement = this.renderer.createElement("span");
this.renderer.addClass(span, "deleteElement");
this.renderer.listen(span, "click", () => {
console.log("I am going to delete you");
});
span.innerHTML = "Del";
let divHoldsSpan: HTMLDivElement = this.renderer.createElement("div");
this.renderer.addClass(divHoldsSpan, "col-lg-2");
this.renderer.appendChild(divHoldsSpan, span);
let image: HTMLImageElement = this.renderer.createElement("img");
this.renderer.addClass(image, "prod_image");
image.src = this.previewUrl;
let divHoldsImage: HTMLDivElement = this.renderer.createElement("div");
this.renderer.addClass(divHoldsImage, "col-lg-2");
this.renderer.appendChild(divHoldsImage, image);
let imageInput: HTMLInputElement = this.renderer.createElement("input");
imageInput.type = "file";
imageInput.accept = "image/*";
this.renderer.listen(imageInput, "change", event => {
// console.log("YOUR FILE,SIR:",e.target.files);
for (let index = 0; index < event.target.files.length; index++) {
let reader = new FileReader();
const fileToUpload = event.target.files[index];
reader.onload = (e: any) => {
image.src = e.target.result;
};
reader.readAsDataURL(event.target.files[index]);
}
});
let divHoldsImageInput: HTMLDivElement = this.renderer.createElement("div");
this.renderer.addClass(divHoldsImageInput, "col-lg-3");
this.renderer.appendChild(divHoldsImageInput, imageInput);
let checkboxInput: HTMLInputElement = this.renderer.createElement("input");
checkboxInput.type = "checkbox";
let divHoldsCheckbox: HTMLDivElement = this.renderer.createElement("div");
this.renderer.addClass(divHoldsCheckbox, "col-lg-2");
this.renderer.appendChild(divHoldsCheckbox, checkboxInput);
let divRow: HTMLDivElement = this.renderer.createElement("div");
this.renderer.addClass(divRow, "row");
this.renderer.appendChild(divRow, divHoldsCheckbox);
this.renderer.appendChild(divRow, divHoldsImageInput);
this.renderer.appendChild(divRow, divHoldsImage);
this.renderer.appendChild(divRow, divHoldsSpan);
let divKtForm = this.renderer.createElement("div");
this.renderer.addClass(divKtForm, "kt-form__group");
this.renderer.addClass(divKtForm, "image-container");
this.renderer.addClass(divKtForm, "container-1");
this.renderer.appendChild(divKtForm, divRow);
this.renderer.appendChild(this.deletableItem.nativeElement, divKtForm);
}
deleteImage() {
console.log;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.