【问题标题】:Resolve function in states of $stateProvider getting executed twice$stateProvider 状态下的解析函数被执行两次
【发布时间】:2019-04-09 06:41:55
【问题描述】:

我在我的应用程序中使用 angularJs 版本 1.4.5 和 angular-ui-router 版本 0.2.18。我注意到我的解析函数会为一个状态执行两次。

我也尝试使用更新到 0.4.3 的 angular-ui-router 版本,但问题没有解决。

我的状态定义之一如下:

$stateProvider
        .state('app', {
            url: '/',
            views: {
                '': {
                    resolve: {                            
                        usersList: function() {
                            return MainService.getUsers().UsersData.$promise.then(
                                function(response) {
                                    return response;
                                }
                            );
                        }
                    },
                    templateUrl: 'app/views/main/main.html',
                    controller: "MainController"
                }
            }
        })

解析函数不应执行两次。它应该只执行一次。

我还注意到,我们首先检查用户是否可以访问某个页面,然后重定向到该页面。我创建了一个示例 plunkr,其中显示已解析的函数正在执行两次:http://next.plnkr.co/edit/evuQuRxYwCNwhAPw?open=lib%2Fscript.js&preview

【问题讨论】:

  • 听起来您的应用程序中可能存在错误,导致路由被调用两次。如果您同时在 HTML 和路由设置中声明控制器,则会发生这种情况。
  • 我检查了控制器仅在状态定义中声明。我在 ui router github 存储库中遇到了这个问题:github.com/angular-ui/ui-router/issues/37。但我仍然找不到任何解决方案。
  • 您是否在该州的 URL 中看到与斜线字符编码相关的链接问题?我不确定它是否与您的情况有关。
  • 对于一种状态,我尝试删除斜杠并在 url 中仅使用一个单词。然后 resolve 只执行一次。但我需要在我的网址中使用斜杠。而且我也用了0.4.3版,问题还是没有解决。
  • 我看到一些建议,如果升级不会造成太多麻烦,它可能会修复 Angular 1.6.8。我在看github.com/angular-ui/ui-router/issues/1645

标签: angularjs


【解决方案1】:

这里的问题(参考your plnkr)是默认路由是route1,所以应用程序在加载时会直接进入该路由。同时,您在运行块中有一个异步 API 调用来检查用户是否被授权使用 route1。一旦对该 API 调用的承诺得到解决,应用程序会再次重定向到 route1,为您提供双重解决。

如果该路由需要可能缺少的授权,则将 route1 作为默认路由的方法没有意义。我建议:

  • 根据用户的授权状态,默认状态就像一个开关,它重定向到 route1 或其他一些路由(未经授权的用户看到的任何内容)。重定向逻辑可以在开关控制器中。
  • 为“$stateChangeStart”实现一个处理程序,该处理程序检查用户的授权并在未授权时将其重定向(当然,请确保将其身份验证状态保持在某个地方,这样您就不会每次都调用该异步 API! )

【讨论】:

  • 在我的真实应用程序中,我有一个默认登录页面,如果用户无权访问该页面,用户将被重定向到该页面。在 app.run 函数中,使用了 2 个代码块: 1) 当用户重新加载页面时,如果用户没有以下代码中的权限,则会检查访问权限,然后将其重定向到请求的页面或登录页面 if( isState1Accessible){$state.go('route1'); 2) 我在“$stateChangeStart”回调函数中使用了相同的逻辑。只有在重新加载状态(不是默认状态)时,状态的解析函数才会被调用两次,而不是在我切换状态时。
猜你喜欢
  • 2020-02-23
  • 1970-01-01
  • 2016-08-07
  • 1970-01-01
  • 1970-01-01
  • 2022-11-26
  • 1970-01-01
  • 2015-02-25
  • 2012-11-21
相关资源
最近更新 更多