Saltar al contenido

¿Cómo se accede al elemento HTML desde una directiva de atributo angular?

Solución:

En realidad, mi comentario de que deberías hacer una console.log(el.nativeElement) debería haberte apuntado en la dirección correcta, pero no esperaba que la salida fuera solo una cadena que representa el DOM Element.

Lo que tienes que hacer para inspeccionarlo de la forma en que te ayuda con tu problema es hacer una console.log(el) en su ejemplo, entonces tendrá acceso a la nativeElement objeto y verá una propiedad llamada innerHTML.

Lo que conducirá a la respuesta a su pregunta original:

let myCurrentContent:string = el.nativeElement.innerHTML; // get the content of your element
el.nativeElement.innerHTML = 'my new content'; // set content of your element

Actualización para un mejor enfoque:

Dado que es la respuesta aceptada y los trabajadores web se están volviendo más importantes día a día (y de todos modos se considera la mejor práctica), quiero agregar esta sugerencia de Mark Rajcok aquí.

La mejor forma de manipular DOM Elements programáticamente está usando el Renderer:

constructor(private _elemRef: ElementRef, private _renderer: Renderer) { 
    this._renderer.setElementProperty(this._elemRef.nativeElement, 'innerHTML', 'my new content');
}

Editar

Ya que Renderer está en desuso ahora, use Renderer2 en su lugar con setProperty


Actualizar:

Esta pregunta con su respuesta explicaba el console.log comportamiento.

Lo que significa que console.dir(el.nativeElement) sería la forma más directa de acceder a la DOM Element como un Objeto “inspeccionable” en su consola para esta situación.


Espero que esto haya ayudado.

Sugiero usar Render, como sugiere el documento de la API de ElementRef:

… eche un vistazo a Renderer, que proporciona una API que se puede utilizar de forma segura incluso cuando no se admite el acceso directo a elementos nativos. Confiar en el acceso DOM directo crea Acoplamiento estrecho entre su aplicación y las capas de renderizado. que lo hará imposible separar los dos e implementar su aplicación en un trabajador web o Universal.

Siempre utilizar el Renderizador porque hará que su código (o la biblioteca que tiene derecho) pueda funcionar cuando utilice Universal o WebWorkers.

import { Directive, ElementRef, HostListener, Input, Renderer } from '@angular/core';

export class HighlightDirective {
    constructor(el: ElementRef, renderer: Renderer) {
        renderer.setElementProperty(el.nativeElement, 'innerHTML', 'some new value');
    }
}

Sin embargo, no parece que Render tenga un método getElementProperty (), así que supongo que todavía necesitamos usar NativeElement para esa parte. O (mejor) pasar el contenido como una propiedad de entrada a la directiva.

Esto se debe a que el contenido de

<p myHighlight>Highlight me!</p>

no se ha renderizado cuando se llama al constructor de HighlightDirective, por lo que todavía no hay contenido.

Si implementa el gancho AfterContentInit, obtendrá el elemento y su contenido.

import { Directive, ElementRef, AfterContentInit } from '@angular/core';

@Directive({ selector: '[myHighlight]' })

export class HighlightDirective {

    constructor(private el: ElementRef) {
        //el.nativeElement.style.backgroundColor="yellow";
    }

    ngAfterContentInit(){
        //you can get to the element content here 
        //this.el.nativeElement
    }
}
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *