Angular 14 innerHtml example with property binding and event handler

This tutorial solves the below problems in the HTML binding Angular application.

  • How to do string raw HTML binding in Angular?
  • Render HTML strings with HTML tags
  • How innerHtml attribute in Angular work?
  • How to sanitize HTML tag content with DomSanitizer
  • innerHtml change event handler exam

What is innerHTML in Angular?

Strings are displayed in Angular using interpolation {{}} syntax. Angular supports display string that contains raw HTML tags using innerhtml property. It is a standard HTML tag that supports angular using property binding [] syntax as given below

<div [innerHtml]="expression">

How do I display HTML inside an Angular binding?

Angular supports raw HTML binding using the innerHtml tag attribute

export class FirstComponent {
  rawHtml: string = "Hello  <strong>User</strong>, Welcome to <i>my site</i>";
}

and html component

<div [innerHtml]>Display raw html content</div>

What is innerHTML used for?

innerHtml attribute for HTML elements used to add or update content such as RAW HTML or XML. Standard HTML supports this tag in all the latest browsers. It also implemented in a framework with 2-way binding in the Angular framework

Angular 14 innerHtml binding example

In Angular, It is simple to bind the properties and events using two-way binding syntax.

Property binding can be done using the below syntax.

[property] = "javascriptexpression";

Event binding syntax as seen below

event = "javascriptexpression";

The above two bindings such as Property and event binding can be written with i.e two-way binding.

syntax is

[property] = "javascriptexpression";

JavaScript expressions are either values and properties from json objects or JavaScript functions.

Suppose, Sometimes we want to bind the HTML response instead of the JSON response in the form of a string.

How does HTML binding work in Angular applications?

using innerHtml attribute binding, We can bind HTML content in the form of a string.

The innerHtml attribute can be added to the HTML tag in two ways.

Syntax:

<div [innerHTML]="variable"></div>
<div innerHTML="{{variable}}"></div>

Here is a typescript component

Created variable content to hold HTML tag strings.

import { Component } from "@angular/core";

@Component({
  selector: "my-app",
  templateUrl: "./app.component.html",
  styleUrls: ["./app.component.css"],
})
export class AppComponent {
  content: string;
  constructor() {
    this.content = "<i>html response</i>";
  }
}

Here is the HTML component

Angular treats innerHtml content as unsafe, so it does sanitize automatically.

<h3>Angular html binding Innerhtml example</h3>
<span [innerHtml]="content"></span>

There is a limitation to this approach.

As the raw HTML content is passed to the angular component, We have to check whether HTML is trusted or not.

Then, How to sanitize raw HTML Angular manually?

  • imported DomSanitizer in the angular component
  • declared variable content of type SafeHtml
  • Pass the content bypassSecurityTrustHtml and return trusted and safe HTML string content
import { Component } from "@angular/core";
import { DomSanitizer, SafeHtml } from "@angular/platform-browser";

@Component({
  selector: "my-app",
  templateUrl: "./app.component.html",
  styleUrls: ["./app.component.css"]
})
export class AppComponent {
  content: SafeHtml;
  constructor(private sanitizer: DomSanitizer) {
    this.content = this.sanitizer.bypassSecurityTrustHtml(
      "<i>html response</i>"
    );
  }
}

Angular innerHtml event handler inside HTML content example

HTML tag string content contains events as part of content, Then how do you initiate a click event bind handler?

In Angular events, listeners are attached to handlers once content is loaded.

ngAfterViewChecked call method used which is a call back method running whenever change detection

In the below example, the button definition is displayed using innerHtml

Once the button is rendered, We are adding click event binding to the button inside the ngAfterViewChecked method. ElementRef QuerySelector method is used to select the DOM Button using id.

Here is a complete example for event listener for innerHtml

import { Component, ElementRef } from "@angular/core";
import { DomSanitizer, SafeHtml } from "@angular/platform-browser";

@Component({
  selector: "my-app",
  templateUrl: "./app.component.html",
  styleUrls: ["./app.component.css"]
})
export class AppComponent {
  content: SafeHtml;

  constructor(private elementRef: ElementRef, private sanitizer: DomSanitizer) {
    this.content = this.sanitizer.bypassSecurityTrustHtml(
      '<button type="button" id="submitButton" (click)="openWindow()">Submit</buttn>'
    );
  }
  openWindow() {
    alert("Welcome");
  }
  ngAfterViewChecked() {
    if (this.elementRef.nativeElement.querySelector("#submitButton")) {
      this.elementRef.nativeElement
        .querySelector("#submitButton")
        .addEventListener("click", this.openWindow.bind(this));
    }
  }
}

Stackblitz code

You can find the code🔗 for this tutorial

Conclusion

to sum up, Angular innerHtml attributes provide a dynamic binding of HTML string content, and also using ngAfterViewChecked, we can bind the event listeners