Angular 9 Renderer2 with Directives Tutorial by Example
In this tutorial, we'll be learning about Renderer2 in Angular 9/8 and directives which allow you to manipulate DOM. Renderer2 is a service which provides methods like createElement
, createText
, appendChild
and addClass
that help you query and manipulate the DOM elements in your Angular 9 application.
We'll learn how to use:
- Renderer2 with Angular 9 directives by example
- Renderer2
createElement
,createText
andappendChild
for creating and appending DOM elements with directives in Angular 9, setAttribute
andremoveAttribute
for dynamically setting and removing DOM attributes,addClass
andremoveClass
for dynamically adding and removing classes in Angular 9 directive,setStyle
andremoveStyle
for dyncamically setting and removing CSS styles,setProperty
for setting DOM properties likehref
of<a>
elements
The Renderer2 Service in Angular 9
As mentionned before, Renderer2 is an Angular service that can be injected in the other services or components. In Angular 9, Renderer is deprecated and Renderer2 is the service that you need to use for working with the DOM.
Renderer2 allows you to create Angular 9 apps which can be rendered in environments that don’t have DOM like servers or web workers.
How to Use Renderer2 with Angular 9 Directive by Example
In this example, we'll use Renderer2 with a custom directive.
Custom directives are great example for Renderer2 in Angular 9 becaue they are the recommended artifacts for working with the DOM.
We'll see how to use the Renderer2' addClass
method of Renderer2 for adding a custom CSS class to the DOM elements where the directive is applied.
Create an Angular 9 Directive
Head over to a terminal, navigate to your Angular 9 project's folder and run the following command:
ng generate directive apply-class
Next, open the src/app/apply-class/apply-class.directive.ts
file and update it as follows:
import { Directive, Renderer2, ElementRef, OnInit } from '@angular/core';
@Directive({
selector: '[applyCSSClass]'
})
export class ApplyClassDirective implements OnInit {
constructor(
private renderer2: Renderer2,
private elementRef: ElementRef
) { }
ngOnInit() {
this.renderer2.addClass(this.elementRef.nativeElement, 'myClass')
}
}
We used Angular's ElementRef
for getting a reference to the native DOM element.
The directive can be used in your Angular templates by attahing it to elements and will add a CSS class called myClass
.
<p applyCSSClass>
Angular 9 Example Directive with Renderer2
</p>
We apply the directive to DOM elements in the template using the selector specified in the directive which is applyCSSClass
.
Angular 9' Renderer2 createElement
, createText
and appendChild
Methods
The createElement
method of Renderer2 allows you to create DOM elements in the Angular way without directy working with DOM.
The createText
method of Renderer2 allows you to create text nodes in the DOM.
Generate an Angular 9 Directive
Head back to your command-line interface and run the following command to generate a directive:
ng generate directive new-node
Open the directive file and update it as follows:
import { Directive, Renderer2, ElementRef, OnInit } from '@angular/core';
@Directive({
selector: '[addNewElement]'
})
export class NewNodeDirective implements OnInit {
constructor(
private renderer2: Renderer2,
private elementRef: ElementRef
) { }
ngOnInit() {
const pNode = this.renderer2.createElement('p');
const txtNode = this.renderer.createText('A new text node');
this.renderer2.appendChild(pNode, txtNode);
this.renderer2.appendChild(this.elementRef.nativeElement, pNode);
}
}
Next, open your Angular template and add the following markup to apply the directive:
<div addNewElement></div>
Angular 9 Renderer2 setAttribute
and removeAttribute
Another use case of Renderer2 in Angular 9 is setting and removing attributes.
Renderer2 provides the setAttribute()
and removeAttribute()
methods for setting and removing attributes from DOM elements in the Angular way without using native JavaScript methods.
Generatig an Angular 9 Directive
Go back to your terminal and generate a new directive as follows:
ng generate directive add-attribute
Open the directive file and update it as follows:
import { Directive, Renderer2, ElementRef, OnInit } from '@angular/core';
@Directive({
selector: '[addAttribute]'
})
export class AddAttributeDirective implements OnInit {
constructor(
private renderer2: Renderer2,
private elementRef: ElementRef
) { }
ngOnInit() {
this.renderer2.setAttribute(this.elementRef.nativeElement, 'aria-hidden', 'true');
}
}
<p addAttribute>Renderer2 Directive</p>
We used the setAttribute()
method to set an attribute in the DOM element.
Angular 9 Renderer2 removeClass
Let's now see how to use the removeClass()
method of Renderer2 in Angular 9.
Create a new remove-class
directive and update it as follows
import { Directive, Renderer2, ElementRef, OnInit } from '@angular/core';
@Directive({
selector: '[removeCSSClass]'
})
export class RemoveClassDirective implements OnInit {
constructor(
private renderer2: Renderer2,
private elementRef: ElementRef
) { }
ngOnInit() {
this.renderer2.removeClass(this.elementRef.nativeElement, 'myClass');
}
}
<p removeCSSClass>Renderer2 removeClass</p>
Angular 9' Renderer2 setStyle
and removeStyle
Just like addClass
and removeClass
, Renderer2 provides the setStyle()
and removeStyle()
methods for dynamically setting and removing styles without working with the DOM using native methods.
These methods allow you to set and remove inline CSS styles in DOM elements:
import { Directive, Renderer2, ElementRef, OnInit } from '@angular/core';
@Directive({
selector: '[addCSSStyle]'
})
export class AddCSSStyleDirective implements OnInit {
constructor(
private renderer2: Renderer2,
private elementRef: ElementRef
) { }
ngOnInit() {
this.renderer2.setStyle(
this.elementRef.nativeElement,
'background-color',
'black'
);
}
}
This is how the directive can be applied in the HTML templates:
<p addCSSStyle>
Renderer 2 setStyle Example
</p>
We can also remove the inline style using the removeStyle()
method:
constructor(
private renderer2: Renderer2,
private elementRef: ElementRef
) {}
ngOnInit() {
this.renderer2.removeStyle(this.elementRef.nativeElement, 'background-color');
}
Angular 9 Renderer2's setProperty
Renderer2 provides the setProperty()
methods allows you to set properties in Angular.
Let's see this by example:
import { Directive, Renderer2, ElementRef, OnInit } from '@angular/core';
@Directive({
selector: '[setHrefProperty]'
})
export class SetHrefDirective implements OnInit {
constructor(
private renderer2: Renderer2,
private elementRef: ElementRef
) { }
ngOnInit() {
this.renderer2.setProperty(this.elementRef.nativeElement, 'href', 'https://techiediaries.com');
}
}
This is how the directive is applied:
<a setHrefProperty>Go to Techiediaries</a>
Conclusion
In this tutorial, we've seen how to use Renderer2 in Angular 9 with directives to access and manipulate the DOM without using native JavaScript methods.
-
Date: