2016-06-21 12 views
6

Io sono po 'confuso che cosa esattamente $ evento facendo qui e qual è la differenza tra questi due esempi

<button (click)="clicked($event)"></button> 

@Component(...) 
class MyComponent { 
    clicked(event) { 
    event.preventDefault(); 
    } 
} 

e

<button (click)="clicked()">Click</button> 



@Component(...) 
    class MyComponent { 
     clicked(event) { 
     } 
    } 
+0

Sotto il cofano Angular usa un parametro chiamato $ event e copia letteralmente il codice di richiamata '' 'cliccato ($ event)' '', quindi l'evento $ è codificato in modo rigido su quel valore. Sembra che questo '' 'self.parentView.context.clicked ($ event)' ''. Se usi un nome personalizzato invece di $ event, ad esempio '' 'event123''', Angular controllerà la proprietà componentInstance.event123 e la passerà come parametro - che sarà probabilmente null/undefined. È un comportamento simile all'utilizzo di gestori inline HTML '' '' '' dove può essere utilizzato solo il testo esatto '' 'event''' – Ryan

+0

@Brian Generalmente non passare l'argomento 'event' come parte del valore dell'attributo, ma il gestore ha quell'argomento' function clickHandler (event) {..} '(se richiesto). Penso che OP dovrebbe sapere, come funzionano gli eventi in DOM, come mostrato [qui] (https://github.com/shamhub/Front-end-programming/blob/master/4_Javascript_Programming/Topic8_DOM_Access/DOM_interface_hierarchy.png) – overexchange

+1

@overexchange You devi passare l'argomento 'evento' dall'attributo dell'elemento '' 'onclick =" clickHandler (event) "' '', altrimenti l'evento non verrà passato al gestore nel file JS. http://plnkr.co/edit/9oOCztMuaq7rkowdHsGT?p=preview Questo si collega molto strettamente a come si sta comportando Angular in questa istanza – Ryan

risposta

3

Se non si passa il $event nel modello, poi si non avrà la variabile $event nel tuo metodo clicked() disponibile.

Vai a questa Plunker per un rapido confronto

+0

Il plunker collegato non funziona –

+1

Haha, lo ha fatto allora. Guardando il Plunker SystemJS di default 'config.js' sembra, che usi sempre la versione più recente di Angular 2. Dove si è spostato 'bootstrap'?Non ho seguito lo sviluppo di TS per un po 'da quando sono passato alla versione di Dart. Grazie a zoechi per avermi illuminato: D – rinukkusu

10

$event è l'evento stesso.

L'evento che associa (someevent) consente di eseguire il binding agli eventi DOM e agli eventi EventEmitter. La sintassi è esattamente la stessa.

Per gli eventi DOM $event è il MouseEvent, KeyboardEvent, o il valore evento del tipo di qualunque evento si ascolta.

Per EventEmitter eventi il ​​valore emessa è disponibile come $event

Assumendo questo esempio $event si riferisce alla emessa istanza Ferrari auto:

@Output() carChange:EventEmitter<Car> = new EventEmitter<Car>(); 

someMethod() { 
    this.carChange.emit(new Car({name: 'Ferrari'})); 
} 

Se non si utilizza $event come nel (click)="clicked()" allora l'evento il valore non è passato.

In realtà, per quanto mi ricordo che è ancora passata in alcuni browser ma non in tutti (non ricordo quali)

Ma se si utilizza la funzionalità Angolari WebWorker, allora il vostro metodo non potrebbe ottenere il evento licenziato o emesso se non lo si elenca esplicitamente.

+0

Penso che '$ event' sia uno dei tipi di eventi (' UIEvent'/'MouseEvent') in questa [gerarchia] (https://github.com/shamhub/Front-end -Programmazione/blob/master/4_Javascript_Programming/Topic8_DOM_Access/DOM_interface_hierarchy.png). È corretto? – overexchange

+0

Nel browser è 'MouseEvent' per' (clic) ', per le uscite, può essere di qualsiasi tipo. –

+0

'click = f()' In HTML con JavaScript, non passiamo 'eventi' nel gestore. Ma la definizione del gestore ha il parametro. 'function f (e) {....}' – overexchange

Problemi correlati