gpt4 book ai didi

javascript - 从 Aurelia View 模型中的 canActivate 导航

转载 作者:行者123 更新时间:2023-11-29 16:47:02 25 4
gpt4 key购买 nike

在我的 Aurelia View 模型中,我试图在 canActivate() 中检查一些先决条件,并基于此决定是否导航到不同的 View 。

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 的 View 仍然被激活(即可以在浏览器中看到).

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

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

请提出建议。

解决方法: 我终于使用了一个简单的技巧,即在 ThisView View 上使用 if.bind。然而,如果我们能以某种方式取消当前指令(来自页面生命周期)并使用新指令,它可能会更有趣。

最佳答案

而不是 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");
}
}

我制作了一个基本的 GistRun 来展示它是如何工作的——我没有使用 promise ,但我相信概念是一样的。

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

关于javascript - 从 Aurelia View 模型中的 canActivate 导航,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40036959/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com