从 Aurelia 视图模型中的 canActivate 导航

Say*_*Pal 2 javascript aurelia

在我的 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,即使我导航到some/other/view是否只找到一项,视图ThisView仍然被激活(即可以在浏览器中看到)。

有没有办法避免这种情况?为此我尝试了几件事。

  1. Returntruefalsefrompromise接受或拒绝激活此视图。但由于此视图是我的应用程序的登录页面,如果被拒绝(返回 false),它会尝试恢复以前不可用的位置,并引发错误。对于这种特定情况,应用程序也不希望恢复以前的位置。
  2. 另一个想法是做类似管道步骤的事情,我们可以做类似的事情next.cancel(new Redirect("some/other/view")),我们可以指示用新的导航指令取消当前的导航指令。但我不确定如何从视图模型中执行相同的操作。

请建议。

解决方法:我最终使用了一个简单的技巧,即使用if.bindon view of ThisView。然而,如果我们能够以某种方式用新指令取消当前指令(从页面生命周期),它可能会更有趣。

Naa*_*dof 5

而不是 this.router.navigate("some/other/view) 您可以不导入重定向并在其中添加重定向吗,即

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");
    }                
}
Run Code Online (Sandbox Code Playgroud)

}

我已经制作了一个基本的 GistRun 来展示它是如何工作的 - 我没有使用承诺,但我相信概念是相同的。

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