I have an Angular 1.x directive that appends an element. In short:
app.directive('mydirective', function() {
template: '<ng-transclude></ng-transclude>',
link: function(el) {
var child = angular.element("<div/>");
el.append(child);
}
I can migrate this directive to Angular 2 like this:
@Directive({
selector: '[mydirective']
})
export class MyDirective implements OnInit {
constructor(private elementRef: ElementRef) { }
ngOnit() {
var child = angular.element("<div/>");
this.elementRef.nativeElement.append(child);
}
}
What's troubling me is this remark in the nativeElement
official documentation:
Use this API as the last resource when direct access to DOM is needed.
My question is - how could I properly migrate this directive to Angular 2? My only requirement is to build an element dynamically and append it to the element with the directive.
Manipulating the DOM is easy with Angular. We can directly access the element by using ElementRef provided by @angular/core . If you manipulate it by using a directive (common use case) — most are likely to use nativeElement directly like this: It will correctly change the color of the element.
Angular 8 directives are DOM elements to interact with your application. Generally, directive is a TypeScript function. When this function executes Angular compiler checked it inside DOM element.
EVENT BINDING : The flow of information from elements in a component to the corresponding component's class is event binding (HTML Template to TS) . Event binding works without having to define a template reference variable. This is the best and the easiest method to manipulate DOM elements.
Use Renderer
provided by Angular to manipulate the DOM:
import { DOCUMENT } from '@angular/common';
export class MyDirective implements OnInit {
constructor(
private elementRef: ElementRef,
private renderer: Renderer2,
@Inject(DOCUMENT) private document: Document) { }
ngOnInit() {
const child = this.document.createElement('div');
this.renderer.appendChild(this.elementRef.nativeElement, child);
}
}
This doesn't depend on the native DOM API like appendChild()
, so in a way it's a platform-independent approach.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With