2016-11-02 12 views
17

Bir bileşenim var ve geri gitmek için kullanıcının tarayıcısında geri düğmesine basıp basmadığını tespit etmem gerekiyor.Angular2'de gezinmeyi tekrar kullanıcı nasıl algılar?

Şu anda yönlendirici olaylarına abone oluyorum.

constructor(private router: Router, private activatedRoute: ActivatedRoute) { 

    this.routerSubscription = router.events 
     .subscribe(event => { 

      // if (event.navigatesBack()) ... 

     }); 

} 

ben window.onpopstate kullanabileceğinizi biliyor ama Angular2 kullanırken bu kesmek gibi hissediyor.

cevap

21

onPopState dinleyicisine sahip PlatformLocation kullanmak mümkündür.

import { PlatformLocation } from '@angular/common' 

(...) 

constructor(location: PlatformLocation) { 

    location.onPopState(() => { 

     console.log('pressed back!'); 

    }); 

} 

(...) 
+0

Bunu app.module'da nasıl içe aktarırım. Bu dersi koyduğum her yerde bir hatam var. – MrD

+6

Açısal belgeler, PlatformLocation'ı doğrudan kullanmamakta, bunun yerine Konum'u kullanmaktadır. –

+2

[@dream_team comment için kaynak] (https://angular.io/api/common/PlatformLocation) – spottedmahn

8

import { HostListener } from '@angular/core'; 
ve sonra window nesne üzerinde popstate dinler:

@HostListener('window:popstate', ['$event']) 
    onPopState(event) { 
    console.log('Back button pressed'); 
    } 

Bu kod popstate olaylar için listenting son Açısal 2.

+1

tarafından önerilen yerine Konum kullanmalısınız. Bu benim için işe yaramıyor. Bu durumda geri düğmesine tıklandığında hiçbir olay tetiklenmez. –

+1

Bu Angular 2 yani en yeni değil. : D Sadece şaka. –

+0

@JhourladEstrella Doğru, cevap zamanındaydı. Aslında 4 üzerinde denemedim. – VSO

10

IMO daha iyi yöntem üzerinde benim için çalışıyor olduğunu lokasyon hizmetine abone olmak için:

import {Location} from "@angular/common"; 

constructor(private location: Location) { } 

ngOnInit() { 
    this.location.subscribe(x => console.log(x)); 
} 

PlatformLocation'ı doğrudan kullanmaz (dokümantasyon önerisi gibi) ve istediğiniz zaman aboneliğinizi iptal edebilirsiniz.

+1

ngOnDestroy() 'dan aboneliğinizi iptal etmeyi unutmayın! –

+0

Alternatif olarak, route.params.subscribe (...); Fark, sayfaya ilk girdiğinizde zaten ateşlenecektir, hangi location.subscribe (...) yapmaz. İkincisi sadece parametre değiştiğinde yanar. –

+1

@ Humppakäräjät Bu, kullanıcının tekrar gezinip yönlendirilmediğini anlamanıza nasıl yardımcı olur? Rotada tarih api'ye erişim yok .. – Mackelito

1

thorin87 yanıtı olarak PlatformLocation'ı kullanmayın. Abonelikten çıkmak için abone olmamız gerekiyor.

import { Subscription } from 'rxjs/Subscription';  ngOnInit() { 
this.subscription = <Subscription> this.location.subscribe(() => x => console.log(x)); 
} 

ngOnDestroy() { 

    this.subscription.unsubscribe(); 
} 
İlgili konular