在角度路由模块中使用“解析”有什么好处

what's the benefits of using `resolve` in angular route modules

本文关键字:解析 什么 路由 模块      更新时间:2023-09-26

ngRouteUI Router都提供了resolve url定义的方法,该方法应在加载路由之前解决。我看过很多解释如何使用它的页面,但几乎没有一个定义使用它的好处。目前,我清楚地看到它的一个很好的用法,即防止未经授权访问视图/数据。这种用法与安全性更相关。

在我看到的示例中,它主要用于获取初始数据并将其注入控制器,但我也可以使用控制器中的服务轻松做到这一点。那么为什么要使用resolve呢?此外,通过使用resolve我应该在由于某种原因数据不可用时处理rejected承诺。应该接收该数据的控制器甚至不会被初始化,因此我应该在$rootScope上处理routeChangeFailed事件以决定如何继续。此外,我还应该以某种方式传递有关什么路由失败以及原因的信息。

所以,再次提出两个问题:
1( 使用resolve方法进行数据检索有什么好处?
2( 处理拒绝/数据检索失败情况的常用方法是什么?

附言。任何关于该主题的好读物都受到高度赞赏。

使用解析方法进行数据检索有什么好处?

不希望你的视图在你得到所需的数据之前渲染,这就是在路由中使用resolve的目的。

显示一半的视图而没有{{necessary. requirements}}是没有用的(这些括号是故意的(

授权数据,作为视图主要部分的数据或在视图呈现之前未加载的数据将从视图(模板(中取出值,最好在实际呈现view之前加载

例如,您的用户配置文件主要包含用户数据,如果没有实际数据,使用数十个ng-if渲染视图是没有用的不是吗?

处理拒绝/失败数据的常用方法是什么 检索情况

redirecting其他routes或路由是首选,但它会影响逻辑。

您可以在$routechangerror或再次捕获拒绝,这取决于您的逻辑

处理拒绝的简单示例:

路由解析

.when('/seedata', 
     { 
      templateUrl: '/partials/seedata.html',
      controller: 'abcCtrl',
       resolve: {
        data : function(dataService){
           if(dataService.hasData()) {
              return true;
           } 
           else {
               return $q.reject('no data');
            }
        }
      }
    });

在运行阶段处理解析

angular.module('test').run(function($rootScope, $location) {
  $rootScope.$on('$routeChangeError', function(evt, current, previous, rejection) {
    if(rejection === 'no data') {
      $location.path('#/wait');
    }
  })
 })