Angular 路由的奇怪行为

2024-04-03

我之前曾问过我奇怪的路由问题。 我现在有一个解决方案,但仍然偶尔会有奇怪的行为。 我的页面应该转到“登录”,一旦成功,然后转到“主”。这实际上现在有效,除了转到登录->主页->空白('')->主页。最后的“闪烁”或刷新我不明白。这解释了最初的行为,它总是默认为“登录”页面,几乎不会停留在主页上。 它碰巧不“闪烁”(空白并重新加载/刷新)。此时控制台清空。

现在它可以工作了,但我仍然觉得有点奇怪。

截至目前:

  1. 页面打开
  2. 空转到主
  3. 在“main”上,它将查看 SiginGuard,它将路由到“signin”
  4. 登录页面打开
  5. 用户输入凭据
  6. 主页打开 --- 以下是奇怪的事情:
  7. 它会变空,重定向到,
  8. 然后通过重定向再次打开主程序

我到处都有警报()来跟踪它 - 没有发生意外的情况

最后注意:如果登录时间超过4~5秒,将重置到登录页面。再次登录时,它将转到主页而不是闪烁(因为它已经“这样做”了)。 有时 API 可能会很慢。我的超时没有任何影响,我的 http 中的某些内容没有等待足够长的时间。

全部代码: 路由:

export const appRoutes: Routes = [
  {
    path: 'signin',
    component: SigninComponent,
    data: {
      title: 'Login',
      subtitle: ''
    }
  },
  {
    path: 'main',
    component: MainComponent,
    canActivate: [SigninGuard],
    data: {
      title: 'Main page',
      subtitle: ''
    }
  },
  {
    path: '',
    redirectTo: '/main',    /// this used to be /signin - which would just should the signin page forever
    pathMatch: 'full'
  },
  {
    path: '**',
    component: NotFoundComponent,
    data: { title: '404' }
  }
]; 

登录卫士:

 canActivate() {
    const currentUser = this.loginInfo.getUserName();
    if (!currentUser) {
    //  alert("message for me"); // used to have such alerts to track the code - it did never go here
      this.router.navigate(['/signin']);
    }
  //  another alert here
    return true;
  }

登录组件:

 signIn(name, pass) {
    console.log("****** initiated");
    const credentials: IAccount = { UserName: name, UserPassword: pass };
      this.loginService.login(credentials).subscribe(result => 
      {
        console.log("****** response 1");
  //       alert("response 1");

        const response = this.getDecodedAccessToken(result.Token.TokenString);
        if(response==null)
        {
          this.loginResult = response.Status;
          alert(this.loginResult); // better error handling needed
          this.router.navigate([ prefix + '/signin']);
        } else {          
          if (response.signum.toLowerCase() === credentials.UserName.toLowerCase()) {
     //       alert("login ok");
            this.loginInfo.setUserName(response.name);
            this.loginInfo.setUserRole(response.role);
            this.loginInfo.setUserId(response.id);

            this.router.navigate([ prefix + '/home']); // goes here - then "flashes"
          }
        }
      },
      error => { this.errorMessage = <any>error; alert("err " + this.errorMessage); }
    );
    console.log("the end");
  }

和登录服务:

  return this.http.post<IResponse>(this.url, JSON.stringify(model), { headers: this.headers }).pipe(
     // map(sdd => {  return sdd; } ) // used to have an alert to check result here
      timeout(990000000),
    //  tap(result => { alert("pong"); console.log('Login result: ' + JSON.stringify(result)) } ),      
      catchError(this.handleError) // this alerts any error - no errors
    );
  }

我发现了问题 与点击按钮时刷新有关,可以通过简单的 return false 修复;当方法/函数完成时

我发现这里描述了这个问题:https://github.com/angular/angular/issues/8537 https://github.com/angular/angular/issues/8537

登录组件,见最后一行

signIn(name, pass) {
    console.log("****** initiated");
    const credentials: IAccount = { UserName: name, UserPassword: pass };
      this.loginService.login(credentials).subscribe(result => 
      {
        console.log("****** response 1");
  //       alert("response 1");

        const response = this.getDecodedAccessToken(result.Token.TokenString);
        if(response==null)
        {
          this.loginResult = response.Status;
          alert(this.loginResult); // better error handling needed
          this.router.navigate([ prefix + '/signin']);
        } else {          
          if (response.signum.toLowerCase() === credentials.UserName.toLowerCase()) {
     //       alert("login ok");
            this.loginInfo.setUserName(response.name);
            this.loginInfo.setUserRole(response.role);
            this.loginInfo.setUserId(response.id);

            this.router.navigate([ prefix + '/home']); // goes here - then "flashes"
          }
        }
      },
      error => { this.errorMessage = <any>error; alert("err " + this.errorMessage); }
    );
    console.log("the end");
    return false; // THIS was needed
  }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Angular 路由的奇怪行为 的相关文章

随机推荐

  • 删除SQL Server中删除SQL文档后的弹出消息

    Goal 在 SQL Server 中移除 删除 SQL 文档时不显示弹出窗口 Problem 在我下载最新版本的 SQL Server 之前 当我删除 SQL 文档时 它没有显示任何有关状态的弹出窗口 当我下载最新版本的 SQL Serv
  • Django DateField 默认选项

    我有一个具有日期时间字段的模型 date models DateField Date default datetime now 当我在内置的 django admin 中检查应用程序时 DateField还附加了时间 因此如果您尝试保存它
  • 如何将联系人添加到 ActiveCampaign API v3 中的列表

    根据v3docs https developers activecampaign com v3 reference lists我应该能够使用联系人 API 将联系人添加到列表中 但我不知道如何执行此操作 因为我在下面看不到任何相关列表Con
  • 如何选择 PrimeFaces TreeTable 中的所有内容?

    我有一个 PrimeFaces 树表 想添加一个复选框 允许用户选择 取消选择全部 这是我的 xhtml 的摘录
  • LibGDX 路径 (CatmullRomSpline) 恒速

    我试图使用 LibGDX CatmullRomSpline 在路径上实现恒定速度 但在使其正常工作时遇到问题 我已经尝试对这个主题进行了很多研究 包括阅读 LibGDX wiki 但他们对实现恒定速度的解释并没有真正意义 我无法让他们的方法
  • 如何获取已安装的 OLE DB 提供程序的列表?

    Microsoft Excel 允许从 其他来源 导入数据 其中一种选择是使用 OLE DB 提供程序 如何获取可用 OLE DB 提供程序的列表 如果您有可用的 powershell 只需将其粘贴到 powershell 命令提示符中 f
  • 这是如何使用 CloudConfigurationManager 设置上下文连接字符串?

    我希望使用 CloudConfigurationManager 以便可以利用 Azure 配置文件 我想使用连接字符串 我在 Cloud cscfg 中添加了一个字符串来配置实体框架上下文 我像这样配置我的上下文 public Domain
  • SOFT_INPUT_ADJUST_RESIZE 从 android 30 开始已弃用

    I used SOFT INPUT ADJUST RESIZE为了在键盘弹出时显示所有内容 根据文档 我添加了新的代码片段 if Build VERSION SDK INT gt Build VERSION CODES R requireA
  • UnsatisfiableError:发现以下规范彼此不兼容:

    我在 Ubuntu 16 04 上运行 并且遇到了 Anaconda 问题 由于软件包不一致 我无法再安装 更新或删除软件包 conda info NVIDIA no NVIDIA devices found active environm
  • 如何在签到前获取 place_id ?

    我的应用程序允许用户使用纬度 经度和地名登录 Facebook 但我不知道如何处理 place 参数 有什么方法可以获取或创建一个吗 每个可签到的地点都必须有一个有效的地点 Facebook 页面 The place参数取入page id地
  • admob广告不显示

    我制作了一个简单的应用程序 并在其中添加了一个广告 但它没有显示在设备中 我的代码中没有错误 xml页面
  • Dockerfile 构建引发不够范围:公共 openjdk 映像授权失败

    我正在尝试使用以下命令运行以下 Dockerfile docker compose up remove orphans force recreate build d Dockerfile FROM maven 3 6 3 jdk 11 as
  • Java中如何查找CPU密集型类?

    我有一个使用多线程的 Java 大型程序 在某些情况下 程序开始使用我的八核系统中的三个核心的 100 在正常使用中 程序以 1 2 的速度使用所有核心 如何找到重载核心的类 使用分析器 例如与 jdk 1 6 0 10 捆绑的 jvisu
  • BIO中的B代表什么?

    OpenSSL 使用称为 I O 抽象BIO http www openssl org docs crypto bio html 但我在文档中找不到任何地方说明 B 代表什么 IO 显然是输入 输出 各种网站表明 B 代表basic or
  • jQuery 自动淡入下一个 html 元素然后循环重新启动

    I have a a a a 其中 i 是从 1 开始的当前迭代的值 并将呈现如下内容 a a a a 我需要的是一个脚本 仅使第一个元素保持可见 然后在几秒钟 假设 4 5 后淡出并淡入下一个元素 并重复这个循环直到最后一个元素 然后循环
  • 如何知道这个线程是否是UI线程

    Android 上有什么方法可以知道运行我的代码的线程是否是 UI 线程 在摇摆有SwingUtilities isEventDispatchThread 告诉我我是否在 UI 线程上 Android SDK 中是否有任何函数可以让我知道这
  • 将查询转换为存储过程

    下面是一个包含临时表的大查询 我一直在试图找出将其转换为存储过程的语法 我似乎无法弄清楚 我应该能够使用变量选择日期范围 Report Start DT and Report End DT CREATE PROCEDURE gw ppp d
  • Selenium Headless Chrome 和语言设置

    我正在使用 python 中的 selenium 和 chrome 驱动程序 我可以像这样设置 chrome 浏览器的语言 options webdriver ChromeOptions options add experimental o
  • 多重继承:派生类仅从一个基类获取属性?

    我试图学习Python中多重继承的概念 考虑一个类Derv派生自两个类 Base1 and Base2 Derv仅继承第一个基类的成员 class Base1 def init self self x 10 class Base2 def
  • Angular 路由的奇怪行为

    我之前曾问过我奇怪的路由问题 我现在有一个解决方案 但仍然偶尔会有奇怪的行为 我的页面应该转到 登录 一旦成功 然后转到 主 这实际上现在有效 除了转到登录 gt 主页 gt 空白 gt 主页 最后的 闪烁 或刷新我不明白 这解释了最初的行