AngularJS $ routeParams解析并承诺

时间:2013-09-04 14:10:16

标签: javascript angularjs promise

所以...我正在尝试学习一些Angular的东西,然后我达到了一个我被卡住的地方。在我的应用中,我使用的是第三方API,因此我不能依赖$http,这就是您在代码中看到$apply的原因。

所以,基本上我有这个:

.when('/dashboard',{
  controller : 'DashboardController',
  templateUrl : 'ui/modules/dashboard/dashboard.html',
  resolve : {
    data : function(myService){
      return myService.start();
    }
  }
})
到目前为止,没有什么比这更奇怪据说这种方法有承诺,对吧?启动功能如下:

var start = function(){
  return initializeConnection().then(function(){
    return login(false);
  });
};

所以,基本上,如果一切正常,一切正常。那很棒。问题是,如果我对第二个函数(即login)做出承诺拒绝,我就无法捕获这个错误,这是我在应用程序顶部创建的AppController(所以它总是被实例化):

$rootScope.$on("$routeChangeError", function (event, previous, current, rejection) {
  console.log('Failing');
});

基本上从未调用过。我试过的解决方案是从start函数返回一个promise,然后如果这些异步函数中的任何一个失败,则返回的promise失败。但正如我所看到的,它应该是不必要的。

你能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:0)

在您的代码中,如果您获得承诺拒绝,则DashboardController永远不会被实例化,并且您的视图永远不会被加载 - 因此您无法做到这一点。即使你的承诺被拒绝,你也需要有一个将被实例化的控制器。

我认为你可以创建一个控制器来处理像$routeChangeError这样的全局事件。我在下面创建了一个名为checkConnection的文件,它将被分配给应用程序的根元素。

var myApp = angular.module('myApp', []);

myApp.config(function($routeProvider){
  $routeProvider
    .when('/dashboard',{
      controller : 'DashboardController',
      templateUrl : 'ui/modules/dashboard/dashboard.html',
      resolve : {
        data : function(myService){
          return myService.start();
        }
      }
    })
});


myApp.controller('checkConnection', function ($rootScope){
    $rootScope.$on("$routeChangeError", function (event, previous, current, rejection) {
      console.log('Failing');
    });
});

myApp.controller('DashboardController', function($rootScope) {
    // code for your controller goes here
});

在index.html中,您将拥有:

<div ng-app="myApp" ng-controller="checkConnection">
    <ng-view></ng-view>
</div>

控制器checkConnection无论如何都会被实例化 - 所以你可以依靠它来处理错误。

如果没有发生错误,那么您正在访问的路由的特定控制器(例如:DashboardController)将正常执行,您的视图将被加载。

还有改进的余地,但我认为这对您有用。

希望有助于或至少指出正确的方向。