typescript 如何将点击事件添加到打字稿中动态添加的 html 元素

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/42692780/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-21 04:19:34  来源:igfitidea点击:

How to add click event to dynamically added html element in typescript

htmlangulartypescriptionic2

提问by Günter Z?chbauer

I'm building an app in angular 2. I want to add a click event to a dynamically added html element. I define a string (contentString), and in this string I define the html element.

我正在构建一个 angular 2 应用程序。我想向动态添加的 html 元素添加一个点击事件。我定义了一个字符串 (contentString),在这个字符串中我定义了 html 元素。

var contentString = '<b>' + this.mName + '</b><br/> ' + this.mObject.category + '<br/> Click here for more information <button (click)="navigate()">Navigate here</button>'; 

This string is put inside a html element like this:

这个字符串被放在一个 html 元素中,如下所示:

var boxText = document.createElement("div");
    boxText.innerHTML = contentString;

Although when I inspect the element, it has the click event defined, but it does not trigger.

虽然当我检查元素时,它定义了点击事件,但它不会触发。

[image 1]

[图 1]

[image 2]

[图 2]

on click it should console log

单击它应该控制台日志

navigate() {
console.log("eeeehnnananaa");
}

But that does not work. Anyone a solution?

但这不起作用。任何人的解决方案?

回答by Günter Z?chbauer

Angular processes the template when the component is compiled. HTML added later is not compiled anymore and bindings are ignored.

Angular 在组件编译时处理模板。以后添加的 HTML 不再编译,绑定将被忽略。

You can use

您可以使用

constructor(private elRef:ElementRef) {}

ngAfterViewInit() {
  // assume dynamic HTML was added before
  this.elRef.nativeElement.querySelector('button').addEventListener('click', this.onClick.bind(this));
}

回答by Sanjay J. Khachane

Call click event dynamically

ConfirmThisOrder(obj) {
    var orderItemID = obj.target.dataset.oid;
}

ItemDetails(orderId, itemIndex) {
if ($("#accordionNew" + itemIndex).closest("div").html().indexOf("div_" + orderId) == -1) {
  this.oRequest = new ORequestParameter();
  var retrievedObject = localStorage.getItem('userObject');
  let userObject = JSON.parse(retrievedObject) as AdminDashboardModel;
  this.oRequest.SellerId = userObject.sellerId;
  this.oRequest.OrderStatus = $("#hdnOrderStatus").val().toString();
  this.oRequest.OrderId = orderId;
  this.oRequest.OrderConfirmationFlag = '0,1,2';
  let sProviderId = "0";
  if (this.MultiSelectObjTypeSelected != undefined) {
    let result2 = this.MultiSelectObjTypeSelected.map(a => a.id);
    if (result2.join().length > 0) {
      sProviderId = result2.join();
    }
  }
  this.oRequest.ProviderID = sProviderId;
  this.orderService.GetItemDetails(this.oRequest).subscribe(
    lstOrderItem => {
      this.lstOrderItem = lstOrderItem;
      var sData = "";
      if (this.lstOrderItem.length > 0) {
        sData += "<div class='col-4 col-lg-4 col-md-4 col-xs-4 text-left' style='font-weight: bold;' id='div_" + orderId + "'>Product Name</div>"; 
        sData += "<div class='col-4 col-lg-4 col-md-4 col-xs-4 text-center' style='font-weight: bold;'>Price</div>";
        sData += "<div class='col-4 col-lg-4 col-md-4 col-xs-4 text-center' style='font-weight: bold;'></div>";
        sData += "<div class='clearfix'></div>";
        var aTag = document.createElement('a');
        for (var i = 0; i < this.lstOrderItem.length; i++) {
            sData += "<div style='background-color:#fff;padding:10px 0;'>";
            sData += "<div class='col-4 col-sm-4 col-lg-4 col-xs-4 col-md-4'>";
            sData += "<span style='text-align: justify;'>" + this.lstOrderItem[i].productName + "</span>"; /*<b style='color:red;' > (" + this.lstOrderItem[i].productType + ") < /b>*/
            sData += "</div>";

            sData += "<div class='col-4 col-sm-4 col-lg-4 col-xs-4 col-md-4 text-center'>";
            sData += "<span><i class='fa fa-inr'></i> " + this.lstOrderItem[i].providerSellingPrice + "</span>";
            sData += "</div>";

            sData += "<div class='col-4 col-lg-4 col-md-4 col-xs-2 text-center' style='font-weight: bold;'>";
            sData += '<a  id="btn_' + this.lstOrderItem[i].orderItemID + '" data-oid=' + this.lstOrderItem[i].orderItemID + ' class="mylink btn btn-success" style="width:70px;">Pending</a>';
            sData += "</div>";
            sData += "</div>";
            sData += "<div class='clearfix'></div>";
        }

        sData += "<div style='background-color:#BFE7FF;padding:15px 0;'>";
        sData += "<div class='col-6 col-sm-6 col-lg-6 col-xs-6 col-md-6' style='font-weight: bold'>Total Billed Amount</div>";
        sData += "<div class='col-2 col-sm-2 col-lg-2 col-xs-2 col-md-2 pull-right text-right'>";
        sData += "<span><b>Price:</b> <i class='fa fa-inr'></i> " + totalAmount + "</span></div>";
        sData += "<div class='clearfix'></div>";
        sData += "</div>";
      }
      else {
        $("#errorMsg").removeClass("hidden");
        $("#errorMsg").addClass("alert-danger");
        $("#errorMsg").html("There was no record found");
      }

      $("#accordionNew" + itemIndex).closest("div").html(sData);
      let children = document.getElementsByClassName("mylink");
      for (let i = 0; i < children.length; i++) {
        children[i].addEventListener("click", (event: Event) => {
          this.ConfirmThisOrder(event);
        });
      }
    },
    error => this.errorMessage = <any>error
  );
}
return false;
}