2016-06-21 28 views
6

Jestem nieco zdezorientowany co dokładnie $ wydarzenie tu robi i jaka jest różnica między tym dwoma przykładami

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

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

i

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



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

Pod maską Angular używa paramu zwanego $ event i dosłownie kopiuje twój kod zwrotny "kliknięty" (zdarzenie $) '' ', więc zdarzenie $ jest zakodowane na sztywno do tej wartości. Wygląda na to '' self.parentView.context.clicked ($ event) '' '. Jeśli użyjesz niestandardowej nazwy zamiast $ event, powiedz '' 'event123''', Angular sprawdzi właściwość componentInstance.event123 i przekaże ją jako parametr - który prawdopodobnie będzie mieć wartość null/undefined. Zachowanie podobne do używania wbudowanych procedur obsługi HTML '' '' 'gdzie tylko dokładny tekst' '' event''' może być użyty – Ryan

+0

@Brian Ogólnie nie przekazuj argumentu 'zdarzenie' jako części wartości atrybutu, ale moduł obsługi ma ten argument' funkcja clickHandler (zdarzenie) {..} '(jeśli jest to wymagane). Myślę, że OP powinien wiedzieć, jak wydarzenia działają w DOM, jak pokazano [tutaj] (https://github.com/shamhub/Front-end-programming/blob/master/4_Javascript_Programming/Topic8_DOM_Access/DOM_interface_hierarchy.png) – overexchange

+1

@overexchange You muszą przekazać argument "zdarzenia" z atrybutu elementu '' 'onclick =" clickHandler (zdarzenie) "' '' lub zdarzenie nie zostanie przekazane do programu obsługi w pliku JS. http://plnkr.co/edit/9oOCztMuaq7rkowdHsGT?p=preview To bardzo ściśle wiąże się z zachowaniem Angulara w tym przypadku. – Ryan

Odpowiedz

3

Jeśli nie zdać $event w szablonie, a następnie nie będzie dostępna zmienna $event w twojej metodzie .

Zobacz ten Plunker dla szybkiego porównania

+0

Dołączony plunker nie działa –

+1

Haha, to wtedy. Patrząc na domyślny Pufnker SystemJS 'config.js' wydaje się, że zawsze używa on najbardziej aktualnej wersji Angular 2. Gdzie przeniesiono 'bootstrap'?Nie śledziłem rozwoju TS przez chwilę, odkąd przełączyłem się na wersję Dart. Dzięki zoechi za oświecenie mnie: D – rinukkusu

10

$event to samo wydarzenie.

Powiązanie zdarzenia (someevent) pozwala powiązać zdarzenia DOM i zdarzenia EventEmitter. Składnia jest dokładnie taka sama.

W przypadku zdarzeń DOM $event to MouseEvent, KeyboardEvent lub wartość zdarzenia typu zdarzenia, którego słuchasz.

Dla EventEmitter wydarzenia emitowana wartość jest dostępna jako $event

Zakładając ten przykład $event nawiązuje do emitowanego przykład Ferrari samochodu:

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

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

Jeśli nie używać $event jak w (click)="clicked()" to zdarzenie wartość nie jest przekazywana.

Właściwie ile pamiętam nadal przekazywane w niektórych przeglądarkach ale nie we wszystkich (nie pamiętam jakie)

Ale jeśli używasz funkcji Angulars WebWorker, wówczas metoda nie może uzyskać zdarzenie wywołane lub emitowane, jeśli nie wymienia się go explicite.

+0

Myślę, że '$ event' jest jednym z typów zdarzeń (' UIEvent'/'MouseEvent') w tym [hierarchii] (https://github.com/shamhub/Front-end -programowanie/blob/master/4_Javascript_Programming/Topic8_DOM_Access/DOM_interface_hierarchy.png). Czy to jest poprawne? – overexchange

+0

W przeglądarce jest to 'MouseEvent' dla' (kliknij) ', dla wyjść może być dowolnego typu. –

+0

'click = f()' W HTML-u z JavaScriptem nie obsługujemy 'zdarzenia' w procedurze obsługi. Ale definicja programu obsługi ma parametr. 'funkcja f (e) {....}' – overexchange

Powiązane problemy