Angular2 obtener la identificación del elemento cliqueado

85

Tengo tal evento de clic

 <button (click)="toggle($event)" class="someclass" id="btn1"></button>
 <button (click)="toggle($event)" class="someclass" id="btn2"></button>

Estoy capturando el evento en mi parámetro de entrada de función y quiero saber exactamente en qué botón se hizo clic.

toggle(event) {

}

pero eventno tiene idpropiedad.

altKey: false
bubbles: true
button: 0
buttons: 0
cancelBubble: false
cancelable: true
clientX: 1198
clientY: 29
ctrlKey: false
currentTarget: button#hdrbtn_notificaton.mdl-button.mdl-js-button.mdl-js-ripple-effect.mdl-button--icon
defaultPrevented: false
detail: 1
eventPhase: 3
fromElement: null
isTrusted: true
isTrusted: true
layerX: -566
layerY: 5
metaKey: false
movementX: 0
movementY: 0
offsetX: 22
offsetY: 13
pageX: 1198
pageY: 29
path: Array[13]
relatedTarget: null
returnValue: true
screenX: 1797
screenY: 148
shiftKey: false
sourceCapabilities: InputDeviceCapabilities
srcElement: span.mdl-button__ripple-container
target: span.mdl-button__ripple-container
timeStamp: 1458032708743
toElement: span.mdl-button__ripple-container
type: "click"
view: Window
webkitMovementX: 0
webkitMovementY: 0
which: 1
x: 1198
y: 29

¿Cómo puedo encontrar un id?

ACTUALIZACIÓN: Plunkers son todos buenos, pero en mi caso tengo localmente:

event.srcElement.attributes.id- indefinido event.currentTarget.id- tiene el valor

Estoy usando Chrome última versión 49.0.2623.87 m

¿Podría ser una Material Design Litecosa? porque lo estoy usando.

ingrese la descripción de la imagen aquí

sreginogemoh
fuente
lo que quiere hacer con id?
Pardeep Jain
Tengo dos botones que activan la misma función de clic. Así que necesito averiguar en cuál se hizo clic
sreginogemoh
simplemente pase lo estático / dinámico idjunto con los parámetros.
Pardeep Jain
¿Por qué es tan difícil conseguir una id?
sreginogemoh
1
Acabo de encontrar eso enevent.currentTarget.id
sreginogemoh

Respuestas:

139

Si desea tener acceso al idatributo del botón, puede aprovechar la srcElementpropiedad del evento:

import {Component} from 'angular2/core';

@Component({
  selector: 'my-app',
  template: `
    <button (click)="onClick($event)" id="test">Click</button>
  `
})
export class AppComponent {
  onClick(event) {
    var target = event.target || event.srcElement || event.currentTarget;
    var idAttr = target.attributes.id;
    var value = idAttr.nodeValue;
  }
}

Vea este plunkr: https://plnkr.co/edit/QGdou4?p=preview .

Vea esta pregunta:

Thierry Templier
fuente
1
event.srcElement.attributes.idno está definido no sé por qué ... pero encontré un idinevent.currentTarget.id
sreginogemoh
De Verdad? ¿Viste mi plunkr? Es lo que uso y no está indefinido ... En mi caso (Chrome), currentTargetno está definido :-( ¿Qué navegador usas?
Thierry Templier
De hecho, es srcElement o target según los navegadores. Vea esta pregunta: stackoverflow.com/questions/5301643/…
Thierry Templier
4
Chrome:angular2.dev.js:23597 TypeError: Cannot read property 'nodeValue' of undefined
sreginogemoh
4
Termino de usar estovar target = event.srcElement.attributes.id || event.currentTarget.id;
sreginogemoh
36

Para usuarios de TypeScript:

    toggle(event: Event): void {
        let elementId: string = (event.target as Element).id;
        // do something with the id... 
    }
quidkid
fuente
5
Esta debería ser la respuesta aceptada en mi opinión, pero puede ser const elementId: string = (event.target as Element).id;
Harish
1
que vuelve en blanco para mí. No nulo ni indefinido, pero en blanco
Darren Street
Gracias. Estaba tan confundido por qué no podía verificar una propiedad de target, o srcTarget, directamente cuando podía verlos todos en la consola. Emitir como elemento, duh.
Jeremy L
Esta debería ser definitivamente la mejor respuesta.
NobodySomewhere
19

Finalmente encontré la forma más sencilla:

<button (click)="toggle($event)" class="someclass" id="btn1"></button>
<button (click)="toggle($event)" class="someclass" id="btn2"></button>

toggle(event) {
   console.log(event.target.id); 
}
micronyks
fuente
Esto podría ser complicado: si su botón tiene algo de contenido HTML, como <button ...><i class="fa fa-check"></i></button>y realmente hace clic en ese ielemento, que es el componente FontAwasome, entonces event.target no es un buttonsino el ielemento.
Skorunka František
2
Para obtener el buttonuso del elemento event.target.closest('button').
Skorunka František
18

Podría simplemente pasar un valor estático (o una variable de *ngForo lo que sea)

<button (click)="toggle(1)" class="someclass">
<button (click)="toggle(2)" class="someclass">
Günter Zöchbauer
fuente
¿Crees que es mejor evitar el uso de un iden tal caso?
sreginogemoh
1
Si el único propósito es pasarlo como parámetro de evento, entonces no usaría una identificación.
Günter Zöchbauer
1
En lugar de usar, idsimplemente elija un índice de una matriz más o menos. A menudo es sorprendente que pasemos por alto las soluciones más sencillas con tanta frecuencia.
Yuri
9

No es necesario aprobar todo el evento (a menos que necesite otros aspectos del evento de los que ha indicado). De hecho, no se recomienda. Puede pasar la referencia del elemento con solo una pequeña modificación.

import {Component} from 'angular2/core';

@Component({
  selector: 'my-app',
  template: `
    <button #btn1 (click)="toggle(btn1)" class="someclass" id="btn1">Button 1</button>
    <button #btn2 (click)="toggle(btn2)" class="someclass" id="btn2">Button 2</button>
  `
})
export class AppComponent {
  buttonValue: string;

  toggle(button) {
    this.buttonValue = button.id;
  }

}

Demostración de StackBlitz

Técnicamente, no necesita encontrar el botón en el que se hizo clic, porque ha pasado el elemento real.

Guiado angular

Greg
fuente
¡Esta debería ser la respuesta correcta según lo indicado por el enlace de @ Greg a la guía angular!
Chrizzldi
4

Cuando tu HTMLElementno tienes un id, nameo classpara llamar

luego usa

<input type="text" (click)="selectedInput($event)">

selectedInput(event: MouseEvent) {
   log(event.srcElement) // HTMInputLElement
}
WasiF
fuente
2

hazlo así simplemente: (como se dice en el comentario, aquí está con un ejemplo con dos métodos)

import {Component} from 'angular2/core';

@Component({
    selector: 'my-app', 
    template: `
      <button (click)="checkEvent($event,'a')" id="abc" class="def">Display Toastr</button>
      <button (click)="checkEvent($event,'b')" id="abc1" class="def1">Display Toastr1</button>
    `
})
export class AppComponent {
  checkEvent(event, id){
    console.log(event, id, event.srcElement.attributes.id);
  }
}

demostración: http://plnkr.co/edit/5kJaj9D13srJxmod213r?p=preview

Pardeep Jain
fuente
4
event.srcElement.attributes.idno está definido en mi caso no sé por qué ... pero encontré un idinevent.currentTarget.id
sreginogemoh
solo verifique en el Objeto de eventdespedido donde puede verid
Pardeep Jain
1
@sreginogemoth también puede verificar: event.target.idtambién puede tener el valor de identificación
Arthur
0

Si desea tener acceso al idatributo del botón en angular 6 siga este código

`@Component({
  selector: 'my-app',
  template: `
    <button (click)="clicked($event)" id="myId">Click Me</button>
  `
})
export class AppComponent {
  clicked(event) {
    const target = event.target || event.srcElement || event.currentTarget;
    const idAttr = target.attributes.id;
    const value = idAttr.nodeValue;
  }
}`

tu iden el valor,

el valor de valuees myId.

Ehsan
fuente