在角度路径模块中使用`resolve`有什么好处

时间:2015-03-28 19:24:33

标签: javascript angularjs

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

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

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

PS。任何有关该主题的好读物都受到高度赞赏。

1 个答案:

答案 0 :(得分:3)

  

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

在获得显示所需数据之前,您不希望渲染视图,这就是在路径中使用resolve的目的。

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

是没用的

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

例如,您的用户配置文件主要包含用户数据,如果没有实际数据,那么用几十ng渲染视图是没用的吗?

  

处理拒绝/失败数据的常用方法有哪些   检索情况

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');
    }
  })

 })