2017-09-29 12 views
1

私は単純なIonic3アプリケーションをいくつかの遅延ページ(IonicPageを使用)とログインページで使用しています。ユーザーが最初にログインしていない限り、すべてのページへのすべてのアクセスをブロックしたいと思います。これがコードバージョンのコードではなくウェブサイトのバージョンを構築することであることを知っていれば、ユーザーにレイジーのURL読み込まれたページにアクセスし、ログインせずにアクセスできますか?私はナビゲーションに「タップ」しそこからログインページにリダイレクトする何らかの方法がなければならないと推測していますが、ドキュメンテーションのどこにもこれが見つかりません。明らかに、私はこれを行うためにすべての遅延読み込みページに同じコードを追加したくありません。ここで ionicウェブサイトの遅延ページにログインする必要があります

はそれがあるべきもののロジックを維持する、これがどのように動作するかについての私の考えです:

// app.component.ts 
import { UserAuthService } from '..'; 

export class MyApp { 
    constructor(userAuth: UserAuthService) { 
    userAuth.init(<whatever dependency needed>); 
    userAuth.unauthorized().subscribe((auth: boolean) => { 
     if (auth) { 
     this.nav.setRoot(HomePage); 
     } 
     else { 
     this.nav.setRoot(LoginPage); 
     this.nav.popToRoot(); 
     } 
    }); 
    } 
} 

// user-auth.service.ts 

export class UserAuthService { 
    private auth: ReplaySubject; 

    init(): { 
    // code here to catch whatever page change there is, check if user is authorized and push new value 
    } 

    unauthorized(): Observable<boolean> { 
    return this.auth.asObservable(); 
    } 
} 

そしてボーナスポイント私は正常で

+0

_Obviously私は追加しませんすべての遅延ロードされたページで同じコードがこれを行う_:したがって、 'NavGuards'を使うのはオプションではありませんか? – sebaferreras

+0

@sebaferreras多分、それは何ですか? – Guillaume

+0

私は自分の答えを元に戻しましたが、それがあなたが探していたものでないかどうかを教えてください。私はもう一度それを削除します... – sebaferreras

答えて

2

をログインした後に元のページに戻ることができた場合作業の時間後、最終的には私は解決策を見つけた:

ステップ1: Defind app.htmlでごion-navの名前:

<ion-nav id="nav" #navCtrl [root]="rootPage"></ion-nav> 

ステップ2:app.component.tsViewchildしてnavを取得:

@ViewChild("navCtrl") nav: NavController; 

ステップ3:app.component.ts内のすべてのページのキャッチionViewDidEnter

ngAfterViewInit() { 
    this.nav.viewDidEnter.subscribe(event=>{ 
     //If user is not logged in 
     if(!this.checkUserLoggedIn()){ 
     if(event.name != "YourLoginPage")this.nav.setRoot("YourLoginPage"); 
     } 
    }) 
} 
checkUserLoggedIn(){ 
    //Your code to check whether user is logged in or not 
} 
+0

うーん、それを行う良い方法。私は2つの質問があります:1)なぜあなたは 'viewWillEnter'のようなものの代わりに' viewDidEnter'を使うのですか?そのため、ユーザーは実際にページを見ることができませんか? 2)これは、 '--prod'フラグを使用し、コードがWebpackによって縮小されてuglifiedになっても、' event.name!= "" YourLoginPage "'のように動作しますか? – sebaferreras

+1

1.これらのライフサイクルフックを停止することができないため、 'viewDidEnter'と' viewWillEnter'は同じです。 'viewWillEnter'を使うと、変更前の' viewDidEnter'ページがまだ起動します。 – Duannx

+1

2.私は '--prod'モードで試してみませんでした。遅延ロードページの名前が変更され、uglifiedされたかどうかはわかりません。それがうまくいかない場合、私は周りに散歩があると信じています – Duannx

関連する問題