Estoy tratando de encapsular las identificaciones de mis elementos agregando la identificación de la instancia de esta manera:
<label for="id-{{ unique }}-name"></label> <input id="id-{{ unique }}-name" type="text" formControlName="name">Anteriormente trabajé con esto: https://stackoverflow.com/a/40140762/12858538 . Pero después de actualizar Angular de 7 a 9, esto parece obsoleto. Estaba pensando en un servicio auxiliar simple, que generaría identificaciones únicas para mi aplicación.
Algo como esto:
@Injectable() export class UniqueIdService { private counter = 0 constructor() {} public getUniqueId (prefix: string) { const id = ++this.counter return prefix + id } }inspirado en lodash uniqueid
Pero prefiero usar angulares construidos en ids. Entonces, mi solución actual es extraer la identificación del atributo _nghost de los componentes.
constructor ( private element: ElementRef, ) { const ngHost = Object.values(this.element.nativeElement.attributes as NamedNodeMap) .find(attr => attr.name.startsWith('_nghost')) .name this.unique = ngHost.substr(ngHost.lastIndexOf('-') + 1) }Pero no estoy del todo contento con esta solución y estoy buscando un acceso directo a la identificación.
¿Alguien sabe cómo acceder a esto?
La ID única en Angular 9 se puede representar como:
_nghost - par - 2 | | | static APP_ID componentDef.id Para acceder a componentDef.id puede hacer lo siguiente:
export class SomeComponent implements OnInit { unique = this.constructor['ɵcmp'].id; donde ɵcmp es una variable privada NG_COMP_DEF