2017-11-10 5 views
4

私が構築しているアプリの一部で、ユーザーが後方にナビゲートしないようにする必要があります。これまでは、この方法を使用しています:角度アプリ(モバイル)の後方ナビゲーションを防止する

ngOnInit() { 

history.pushState(null, null, location.href); 
window.onpopstate = function(event) { 
    history.go(1); 
}; 
} 

ngOnDestroy() { 
window.onpopstate = function(event) { 
    history.go(); 
}; 
} 

これは、iOS ChromeとSafariを除いて素晴らしい機能です。私も試しました:

history.replaceState(null, document.title, location.pathname); 

ngOnInitで運がありません。誰かが、これらのモバイルデバイス上のブラウザがWindows/macOSバージョンのブラウザとは異なる履歴やポップステートをどのように使用しているかについて教えてもらえますか?

+0

ユーザーに対して何かをやっていることなので、あなたはそれがすべての環境のために働いてもらう場合でも、それは変更することができます新しいブラウザのバージョンで。 canDeactivate認証ガードの使用を検討しましたか?「あなたがページを出るとあなたのデータは失われますか?代わりに? –

+0

セキュリティ上の理由からこれは不可能だと思います。これが可能なときに詐欺師ができる迷惑なことを考えてみましょう。 – Red

+0

どのバージョンのAngular? – BeetleJuice

答えて

2

さまざまなブラウザ固有のソリューションを実装するのではなく、AngularのCanDeactivate guardについて考えてみましょう。

@Injectable() 
export class NavigatorService{ 
    private previousRoute:string = null; 
    private currentRoute:string = null; 
    /** Listen to and log new route paths */ 
    constructor(private router:Router){ 
    router.events.filter(e => e instanceof NavigationEnd).subscribe(
     e => { 
     this.previousRoute = this.currentRoute; 
     this.currentRoute = e['url']; 
     } 
    ) 
    } 
    /** Checks whether the next route corresponds to the previous route */ 
    isGoingBack(nextState:RouterStateSnapshot){     
     return nextState.url === this.previousRoute; 
    } 
} 

次は、ユーザーが離れてから移動を許可するかどうかを判断するために、このサービスに依存しますCanDeactivateGuardを作成します。

は、あなたが常に前のルートを保存するサービスを(のはNavigatorServiceそれを呼びましょう)があるとし現在のビュー:最後に

@Injectable() 
export class BackwardGuard implements CanDeactivate<any> { 
    // Inject the service needed 
    constructor(navigatorService:NavigatorService){} 

    // Angular 4 provides these arguments to any CanDeactivate guard 
    // see https://angular.io/api/router/CanDeactivate#interface-overview 
    canDeactivate(component:any, currentRoute:ActivatedRouteSnapshot, 
      currentState:RouterStateSnapshot, nextState:RouterStateSnapshot){     
     // Allow navigation only if the user is not going back 
     return !this.navigatorService.isGoingBack(nextState); 
    } 
} 

は、その成分あなたが後方ナビゲーションから保護するルートで、このガードを登録します。

appRoutes:Routes = [ 
    { 
    path: 'some-path', 
    component: ProtectedComponent, 
    canDeactivate: [BackwardGuard] 
    } 
]; 

このテストされていないコードにはバグがあるかもしれませんが、一度解凍すると動作するはずです。あなたのコンポーネントのモジュール(例:AppModule)へNavigatorServiceを提供することを忘れないでくださいとのマッチングルーティングモジュール(例:AppRoutingModule)へBackwardGuardを提供するために、

+0

私はこのルートを降りたが、私は現在のルート(私は思う)を得る方法を見つけることができなかったので安心した。私はあなたの実装で同じことを見ていると信じています。私はエラーを取得しています: "名前 'RouterEvent'を見つけることができません。" APIが変更されているとあなたは何をすべきか知っていますか? – Anthony

+1

'RouterEvent'は' @ angle/router'からインポートする必要があります。 [ドキュメントを見る](https://angular.io/api/router/RouterEvent) – BeetleJuice

+0

新しい5.0.1のみであることを確かめてください。 4.3.1でインポートできません。 – Anthony

関連する問題