当前位置: 首页 > 面试题库 >

如何处理angular-ui-router解析中的错误

仲孙景胜
2023-03-14
问题内容

我正在使用angular-ui-router
resolve从服务器获取数据,然后再进入一种状态。有时,对服务器的请求失败,我需要通知用户有关失败的信息。如果我从控制器呼叫服务器,则可以then在呼叫失败的情况下在其中放置并呼叫通知服务。我将呼叫发送到服务器是resolve因为我希望子孙状态在服务器启动之前等待服务器的结果。

万一对服务器的调用失败,在哪里可以捕获错误?(我已经阅读了文档,但仍然不确定如何使用。此外,我正在寻找尝试这个新代码段工具的原因:)。

"use strict";



angular.module('MyApp', ["ui.router"]).config([

  "$stateProvider",

  "$urlRouterProvider",

  function ($stateProvider, $urlRouterProvider) {

    $urlRouterProvider.otherwise("/item");

    $stateProvider

    .state("list", {

      url: "/item",

      template: '<div>{{listvm}}</div>' +

        '<a ui-sref="list.detail({id:8})">go to child state and trigger resolve</a>' +

        '<ui-view />',

      controller: ["$scope", "$state", function($scope, $state){

          $scope.listvm = { state: $state.current.name };

      }]

    })

    .state("list.detail", {

      url: "/{id}",

      template: '<div>{{detailvm}}</div>',

      resolve: {

        data: ["$q", "$timeout", function ($q, $timeout) {

          var deferred = $q.defer();

          $timeout(function () {

            //deferred.resolve("successful");

            deferred.reject("fail");   // resolve fails here

          }, 2000);

          return deferred.promise;

        }]

      },

      controller: ["$scope", "data", "$state", function ($scope, data, $state) {

        $scope.detailvm = {

          state: $state.current.name,

          data: data

        };

      }]

    });

  }

]);


<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.2.22/angular.min.js"></script>

<script src="http://cdnjs.cloudflare.com/ajax/libs/angular-ui-router/0.2.10/angular-ui-router.min.js"></script>



<div ng-app="MyApp">

  <ui-view />

</div>

问题答案:

问题是,如果路由解析中的任何依赖项 被拒绝 ,则控制器 将不会 被实例化。因此,您可以将故障转换为可以在实例化控制器中检测到的数据。

伪代码示例:-

   data: ["$q", "$timeout","$http", function ($q, $timeout, $http) {
      return $timeout(function () { //timeout already returns a promise
        //return "Yes";
        //return success of failure
         return success ? {status:true, data:data} : {status:false}; //return a status from here
       }, 2000);
     }]

并在您的控制器中:

 controller: ["$scope", "data", "$state", function ($scope, data, $state) {
      //If it has failed
      if(!data.status){
        $scope.error = "Some error";
       return;
      }
        $scope.detailvm = {
          state: $state.current.name,
          data: data
        };

如果您正在$http通话或进行类似操作,则即使出现故障,也可以使用http promise始终解析数据并将状态返回给控制器。

例:-

resolve: {
        data: ["$q", "$timeout","$http", function ($q, $timeout, $http) {
           return $http.get("someurl")
             .then(function(){ return {status:true , data: "Yes"} }, 
                    function(){ return {status:false} }); //In case of failure catch it and return a valid data inorder for the controller to get instantated
        }]
      },



"use strict";



angular.module('MyApp', ["ui.router"]).config([

  "$stateProvider",

  "$urlRouterProvider",

  function ($stateProvider, $urlRouterProvider) {

    $urlRouterProvider.otherwise("/item");

    $stateProvider

    .state("list", {

      url: "/item",

      template: '<div>{{error}}</div><div>{{listvm}}</div>' +

        '<a ui-sref="list.detail({id:8})">go to child state and trigger resolve</a>' +

        '<ui-view />',

      controller: ["$scope", "$state", function($scope, $state){

       $scope.listvm = { state: $state.current.name };

      }]

    })

    .state("list.detail", {

      url: "/{id}",

      template: '<div>{{detailvm}}</div>',

      resolve: {

        data: ["$q", "$timeout","$http", function ($q, $timeout, $http) {

           return $http.get("/").then(function(){ return {status:true , data: "Yes"} }, function(){ return {status:false} })

        }]

      },

      controller: ["$scope", "data", "$state", function ($scope, data, $state) {





        $scope.detailvm = {

          state: $state.current.name,

          data: data.status ? data :"OOPS Error"

        };



      }]

    });

  }

]);


 <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.2.22/angular.min.js"></script>

    <script data-require="angular-ui-router@*" data-semver="0.2.10" src="//cdnjs.cloudflare.com/ajax/libs/angular-ui-router/0.2.10/angular-ui-router.js"></script>

  <div ng-app="MyApp">

      <ui-view></ui-view>

    </div>


 类似资料:
  • 本文向大家介绍angular-ui-router 将数据解析为状态,包括了angular-ui-router 将数据解析为状态的使用技巧和注意事项,需要的朋友参考一下 示例 您可以resolve在转换到状态时将数据转换为状态,通常在状态需要使用该数据或在某些提供的输入需要进行身份验证时解析为状态时非常有用。 定义状态时,您需要提供要解析到.resolve属性中的值的映射,每个解析后的值都应具有一个

  • 问题内容: 此问题涉及angular-app项目及其对用户进行身份验证的方式。 原始实现通过使用路由器上的resolve子句来保护对某些URL的访问。看起来像: }); 直到对用户进行身份验证并提取项目(以防止ui闪烁),才会渲染视图。如果用户未通过身份验证,则将弹出登录弹出窗口,在用户提交后,将解决承诺并显示请求的页面。如果在Projects.all()调用中不需要身份验证,则此方法很好用。 这

  • 问题内容: 我正在使用angular-ui-router库,URL出现问题。 我有以下代码: app.js: index.html: 这行得通,但是当我从标记中删除“#”时,此行不通。 如何从网址中删除“#”符号? 问题答案: 如果要导航而不使用哈希标签,则需要启用HTML5Mode: 您还需要通过将以下代码添加到HTML文件的来告诉angular应用的根URL : 请注意,对HTML5模式的支持

  • 问题内容: 亲爱的我是Angularjs的新手,我正在用Angular创建模式。我在网上发现的一个例子如下,我很难理解 我感到困惑的是我已经作为函数参数接收的cartObj通过依赖注入传递给我的控制器。但是,为什么我必须创建一个名为cartObj的函数并返回该变量。似乎令人困惑。谁能帮忙吗? 问题答案: 这是逐行细分: 正在创建一个名为checkout的$ scope变量,该变量引用一个函数,以便

  • 问题内容: 在我正在开发的一个有角度的应用程序中,我希望有一个抽象的父状态,该状态必须解析其所有子状态的某些依赖关系。具体来说,我希望所有要求经过身份验证的用户的状态都必须从某些authroot状态继承该依赖项。 我遇到了无法始终解决父依赖关系的问题。理想情况下,我想让父状态检查用户是否仍自动登录到任何子状态。在文档中,它说 子状态将从父状态继承已解析的依赖项,并可以将其覆盖。 我发现仅当我从父级

  • 问题内容: 您好,我是angularJS的新手,并一直在尝试阻止根据用户critera访问某些状态。 这是从ui-router的FAQ中准确描述的,但是我无法使其正常工作。我需要什么,但要在数据对象中准确地完成此操作? (我看到有人在某些博客文章教程中投入“ true”,并像我一样使用它,但这似乎不起作用,因为我收到一条错误消息,指出needAdmin未定义) 这是我的代码: 问题答案: 如果状态