2016-10-14 6 views
1

私のAureliaビューモデルでは、canActivate()のいくつかの前提条件をチェックしようとしており、それに基づいて別のビューにナビゲートするかどうかを決定します。見つかった唯一の項目がある場合AureliaビューモデルのcanActivateからのナビゲート

export class ThisView{ 

    canActivate() {   
     const self = this; 
     const promise = self.services.get(url) 
      .then((items: any) => { 
       if (items) { 
        self.items= items; 
        if (self.items.length === 1) { 
         this.router.navigate("some/other/view"); 
         //return false; 
        } 
        //return true; 
       } else { 
        self.logger.error("No item found"); 
        //return false; 
       }     
      }); 
     return promise; 
    } 
} 

は今、私はsome/other/viewに移動していたとしても、ThisViewのビューはまだ(つまりブラウザで見ることができる)が起動されます。

これを避ける方法はありますか?私はこれを試してみました。

  1. 戻りtrue、又はpromiseからfalse受け入れる、またはこのビューの活性化を拒絶します。しかし、このビューはアプリケーションのランディングページの一種であるため、拒否された場合(falseが返された場合)は使用できない前の場所を復元しようとし、エラーをスローします。また、この特定のケースのアプリケーションでは、以前の場所の復元も望ましくありません。
  2. もう1つのアイデアは、next.cancel(new Redirect("some/other/view"))のような何かを行うことができるパイプラインステップのようなことでした。ここでは、新しいナビゲーション命令をキャンセルするように指示できます。しかし、私はビューモデルから同じことをどうやって行うのか分かりません。

お勧めします。

は回避策:私は最終的にThisViewのビューにif.bindを使用しての簡単なトリックを使用していました。しかし、私たちがどういうわけか(ページライフサイクルから)新しい命令で現在の命令を取り消すことができれば、もっと面白いかもしれません。

答えて

3

代わりのthis.router.navigate(「一部/その他/ビュー)リダイレクトをインポートして追加することはできませんすなわち

import {Redirect} from 'aurelia-router'; 

export class ThisView{ 

canActivate() {   
    const self = this; 
    var items = self.services.get(url); 
    if(items){ 
     self.items= items; 
     if (self.items.length === 1) { 
      return new Redirect("some/other/view"); 
     } 
     return true; 
    } 
    else { 
     self.logger.error("No item found"); 
     return new Redirect("not-found-view"); 
    }     
} 

}

私はこれがどのように動作するかを示す基本的なGistRunを作った、そこにリダイレクトする - 。私は約束を使用していないが、私は、コンセプトは同じであると考えてい

https://gist.run/?id=52301f1b2898691ff4d54f320f61f6c6

0

承認手順が実行されたのと同じ方法で、ルーターパイプラインにミドルウェアを挿入することもできます。

あなたは特定のステップでサービスを呼び出し、結果に応じて別のビューにルーティングします。ステップは、ルータのパイプラインに追加する方法について

いくつかのコードスニペットは、ここで見つけることができます: Aurelia: During a Router's Pipeline Step, how do I bind a variable to that router?

+0

ありがとうございました。パイプラインステップを使用することは、1回だけ行う必要があるため、これに対して過剰なことがありますが、各ナビゲーション要求に対してパイプラインステップが実行されます。 –

1

あなたは、ルータのナビゲーションを処理するためにactivate()イベントを使用することができます。ナビゲーションを停止するにはエラーを投げ、別の場所に移動/リダイレクトします。例:

import {Router} from 'aurelia-router'; 

export class SampleModel { 
    static inject() { return [Router] }; 

    constructor(router) { 
    this.router = router; 
    } 

    activate(){ 
    if(this.somedata === null){ 
     // stop navigation or goto start location 
     if(this.router.history.previousLocation){ 
     // stop from navigation 
     throw new Error('Wrong data'); 
     }else{ 
     // return to start page 
     this.router.navigate('start'); 
     } 
    } 
    } 
} 
関連する問題