2016-02-09 11 views
5

Mam komponent abc (część strony). Ma mouseup zdarzenia.Jak uzyskać mouseup poza komponentem w Angular 2

@Component({ 
    selector: 'abc-component' 
}) 
@View({ 
    <div (mousedown)="mouseDown()" (mouseup)="mouseUp()"></div> 
}) 
export class ScheduleComponent { 
    mouseDown(){ 
     //doSomthing 
    } 
    mouseUp(){} 
} 

Ale wydarzenie mouseUp może tylko wywołać gdy mysz wewnątrz <div>. Jak mogę wyzwolić zdarzenie, nawet poza numerem <div>?

Czy muszę przejść (mouseup)="mouseUp()" do app.ts a następnie użyć czegoś podobnego @Output lub service pozwolić app.ts wiedzieć? Czy jest jakiś inny sposób?

Dzięki

Odpowiedz

8

Dodaj globalny cel zdarzeń jak

<div (window:mousedown)="mouseDown()" (window:mouseup)="mouseUp()"></div> 

słuchać wydarzeń na całym świecie. (i document działa również).

Działa to oczywiście także w klasie komponentów

@HostListener('window:mouseup', ['$event']) 
mouseUp(event){} 
+1

dzięki! przestaw na angular2 way –

+1

Przykro mi, właśnie wstałem z łóżka ;-) Dzięki za poprawki! –

1

Element można uzyskać dostęp zdarzeń przez window i document obiektów. Można więc założyć detektor zdarzeń w konstruktorze komponentu:

constructor() { 
    document.body.addEventListener("mouseup",() => { 
    this.mouseup(); 
    }); 
} 
+0

To działa! Dzięki, @MattScarpino, wystarczy zmienić 'function() {}' na '() => {}', w przeciwnym razie nie może znaleźć 'mouseup()'. –

1

Wewnątrz elementu jego wolał zrobić następująco:

@HostListener('document:mouseup', ['$event']) 
onMouseUp(event: MouseEvent) { 
    ... 
} 

w ten sposób nie trzeba będzie usunąć zdarzenie na ngDestroy