2016-08-17 12 views
9

pracuję nad aplikacji rozmawiać za pomocą kątowej 2.kątowa 2 - wykonanie kodu podczas zamykania okna

Jak mogę wysłać polecenie czat mety na backend, gdy użytkownik zamyka okno?

Mój składnik ma metody, która wywołuje usługę backend, aby zakończyć rozmowę w następujący sposób

endChat() { 
 
     this.chatService.endChat(this.chatSessionInfo).subscribe(
 
      result => this.OnGetMessages(result), 
 
      error => this.OnChatEndError(error) 
 
     ); 
 
    }

Jak można wykonać ten kod podczas zamykania okna? Jak mogę wykryć zdarzenie zamknięcia okna?

Próbowałem z ngOnDestroy, ale z jakiegoś powodu kod nie jest wykonywany.

W moim Component.ts mam.

import { Component, OnInit, AfterViewChecked, ElementRef, ViewChild,OnDestroy} from '@angular/core'; 

export class ChatComponent implements OnInit, AfterViewChecked,OnDestroy { 

i wreszcie

ngOnDestroy() { 
    this.endChat(); 
} 

Dzięki!

+0

Czy zaimplementowałeś backend z gniazdem socket.io? – rinukkusu

+0

Nie, używam WebApi 2 – federom

+0

Nie wiem, w jaki sposób podłączyłeś swój czat w tle, ale proponuję użyć ['SignalR'] (http://www.asp.net/signalr) na coś jak czat. Po rozłączeniu zostanie wyświetlone [uruchomione zdarzenie] (http://www.asp.net/signalr/overview/guide-to-the-api/handling-connection-lifetime-events) na serwerze. Zobacz przykład: https://github.com/FabianGosebrink/ASPNET-Core-Angular2-SignalR-Typescript – rinukkusu

Odpowiedz

20

Dzięki wszystkim za pomoc. Udało mi się stworzyć rozwiązanie oparte na innej propozycji.

Najpierw użyłem zdarzenie beforeunload w składniku

@HostListener('window:beforeunload', ['$event']) 
beforeunloadHandler(event) { 
    this.endChat(); 
} 

gdzie

endChat() { 
    this.chatService.endChatSync(this.chatSessionInfo); 
} 

Następnie Sztuką jest, aby synchronizacja połączeń HTTP nie asynchroniczny.

Przed metoda endchat w służbie czatu był

endChat(chatSessionInfo: ChatSessionInfo) : Observable<ChatTranscription> { 
    console.log("Ending chat.."); 
    let body = JSON.stringify(chatSessionInfo); 
    let headers = new Headers({ 'Content-Type': 'application/json' }); 
    let options = new RequestOptions({ headers: headers }); 
    return this.http.delete(this.apiUrl + "Chat?userId="+chatSessionInfo.UserId+"&secureKey="+chatSessionInfo.SecureKey,options) 
      .map(this.extractData) 
      .catch(this.handleError); 
} 

udało mi się zrobić to praca z

endChatSync(chatSessionInfo: ChatSessionInfo) { 
    console.log("Ending chat.."); 
    let xhr = new XMLHttpRequest() 
    xhr.open("DELETE",this.apiUrl +"Chat?userId="+chatSessionInfo.UserId+"&secureKey="+chatSessionInfo.SecureKey,false); 
    xhr.send(); 
} 

nadzieję, że to pomaga!

+1

Czy przetestowałeś 'nowy XMLHttpRequest()' we wszystkich przeglądarkach? –

14
@HostListener('window:unload', ['$event']) 
unloadHandler(event) { 
    ... 
} 

Zobacz także javascript to check when the browser window is close

+0

Czy ma to limit czasu lub czy blokuje się, dopóki program obsługi się nie zakończy? – rinukkusu

+1

Zobacz https: //developer.mozilla.org/de/docs/Web/API/WindowEventHandlers/onunload, https://developer.mozilla.org/de/docs/Web/Events/beforeunload. Nie używałem ich przez jakiś czas i nie pamiętam szczegółów. –

+0

Problem w tym przypadku polega na tym, że okno zostaje zamknięte przed wysłaniem zgłoszenia serwisowego. – federom

Powiązane problemy