2016-02-14 10 views
24

Mam dyrektywę inicjującą sortowanie jQueryUI na elemencie DOM. JQueryUI sortable ma również zestaw zdarzeń wywołania zwrotnego, które wyzwalają w przypadku niektórych akcji. Na przykład, gdy sortujesz elementy start lub stop.Zdawanie parametrów za pomocą EventEmittera

Chciałbym przekazać parametry zwracane z takiego zdarzenia za pomocą funkcji emit(), dzięki czemu mogę rzeczywiście zobaczyć, co stało się w mojej funkcji wywołania zwrotnego. Po prostu nie znalazłem sposobu na przekazanie parametrów przez EventEmiiter.

Obecnie mam następujące.

Moja dyrektywy:

@Directive({ 
    selector: '[sortable]' 
}) 
export class Sortable { 
    @Output() stopSort = new EventEmitter(); 

    constructor(el: ElementRef) { 
     console.log('directive'); 
     var options = { 
      stop: (event, ui) => { 
      this.stopSort.emit(); // How to pass the params event and ui...? 
      } 
     }; 

     $(el.nativeElement).sortable(options).disableSelection(); 
    } 
} 

A to moja Component który wykorzystuje zdarzenie emiited przez dyrektywy:

@Component({ 
    selector: 'my-app', 
    directives: [Sortable], 
    providers: [], 
    template: ` 
    <div> 
     <h2>Event from jQueryUI to Component demo</h2> 

     <ul id="sortable" sortable (stopSort)="stopSort(event, ui)"> 
     <li class="ui-state-default"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 1</li> 
     <li class="ui-state-default"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 2</li> 
     <li class="ui-state-default"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 3</li> 
     </ul> 
    </div> 
    ` 
}) 
export class App { 
    constructor() { 

    } 

    stopSort(event, ui) { // How do I get the 'event' and 'ui' params here? 
    console.log('STOP SORT!', event); 
    } 
} 

Jak mogę uzyskać event i ui params w moim stopSort() funkcji ?

Oto demo, co mam do tej pory: http://plnkr.co/edit/5ACcetgwWWgTsKs1kWrA?p=info

+0

Nie jestem w stanie dowiedzieć się, jaki powinien być "ui". Skąd to pochodzi? Do czego powinno się odnosić? –

Odpowiedz

56

EventEmitter obsługuje jeden argument, który jest przekazywany jako $event do obsługi zdarzeń.

owinąć parametry obiektu zdarzenia, kiedy przekazać go do emit:

this.stopSort.emit({ event:event, ui: ui }); 

Wtedy, kiedy obsłużyć zdarzenia, użyj $event:

stopSort($event) { 
    alert('event param from Component: ' +$event.event); 
    alert('ui param from Component: ' + $event.ui); 
} 

Demo Plnkr

+5

Wystarczy mała uwaga przy użyciu ES6 {event: event, ui: ui} można skrócić do {event, ui} – ErazerBrecht

5

Odpowiedź pixelbits zmieniła się nieco w ostatecznym wydaniu. Jeśli masz wiele parametrów, po prostu przepuść je jako jeden obiekt.

komponent dziecka:

this.stopSort.emit({event,ui}); 

@Output() stopSort= new EventEmitter<any>(); 

nadrzędna Składnik:

hereIsHeight(value) { 
     console.log("Height = " + value.event); 
     console.log("Title = " + value.ui); 
    } 

HTML w składniku dominującej:

<test-child1 (stopSort)="hereIsHeight($event)"></test-child1> 

- Również jeśli mają wartości jak: (z "to" z przodu)

this.stopSort.emit({this.event,this.ui}); 

nie zadziała, trzeba je zmienić na coś innego, a następnie przejść przez jak:

let val1 = this.event; 
let val2 = this.ui; 
this.stopSort.emit({val1,val2}); 

* Aktualizacja: Przeczytaj odpowiedź Collina B poniżej sposobu, aby przekazywać wartości z „tego ."

1

mogę nie dodać komentarz, ale po prostu chciałem podkreślić z odpowiedzią Alpha Bravo, który można przekazać this.event, po prostu nie można użyć wartości nieruchomości skrótów:

this.stopSort.emit({ event : this.event, ui : this.ui });


należy również pamiętać, jeśli są one przekazywane przez EventEmmiter jak this.stopSort.emit({ val1, val2 }); potem byłyby dostępne w macierzystym jak:

hereIsHeight(value) { 
    console.log(`event = ${ value.val1 }`); 
    console.log(`ui = ${ value.val2 }`); 
} 

Tak więc unikanie skrótów może być lepsze w tego typu sytuacjach, aby utrzymać konsekwentne nazewnictwo.

Powiązane problemy