2013-07-19 29 views
13

我有一个决心在我的routeprovider上工作,但我只是返回承诺,所以我不知道它的成功或失败。这是我AngularJS:在RouteProvider中解析 - 检测成功/失败?

.when('/items', { 
    templateUrl: 'views/items.html', 
    controller: 'ItemsCtrl', 
    resolve: { 
     resolvedData: function(Restangular) { 
      return Restangular.one('Items').get(); 
     } 
    } 
}) 

现在这的工作,但我怎样检测成功或失败...我可以在解决方法进入这一点,但你会回到我的成功和失败......记住我需要在我的控制器中注入项目。

.when('/items', { 
    templateUrl: 'views/items.html', 
    controller: 'ItemsCtrl', 
    resolve: { 
     resolvedData: function(Restangular) { 
      Restangular.one('Items').get().then(function(data) { 
       // success 
      }, function() { 
       // failure 
      }); 
     } 
    } 
}) 

我在这里看到一个例子,但我很困惑,如果这是我需要和如何使用它?

AngularJS - rejected $http promise with $routeProvider:resolve

这似乎是返回一个手动承诺。

resolve: { 
    response: ['Warranty' 
     '$q', 
     function(Warranty, $q) { 
      var dfd = $q.defer(); 
      Warranty.sendRequest().then(function(result) { 
       dfd.resolve({ 
        success: true, 
        result: result 
       }); 
      }, function(error) { 
       dfd.resolve({ 
        success: false, 
        reason: error 
       }); 
      }); 
      return dfd.promise; 
     } 
    ] 
} 

我真的很感谢任何人的帮助。

我真的想要做的是在我的控制器有解决变量注入到控制器,如果它失败了,那么我也想访问控制器中的失败,所以我可以向用户显示它没有由于问题而无法呈现。

回答

10

您可以只返回then方法的返回值:

resolve: { 
    resolvedData: function(Restangular){ 
     return Restangular.one('Items').get().then(function (data) { 
      ... 
      return successData; // resolvedData will be resolved with the successData 
      }, function() { 
      ... 
      return failureData; // resolvedData will be resolved with the failureData 
      }); 
    } 
} 

then方法doc

该方法返回一个新的承诺,这是通过的返回值解决或拒绝successCallback或errorCallback。

+1

啊,这是伟大的,在我的控制器中,我将如何确定我注射的价值是成功还是失败? – Martin

+2

返回一个对象,例如{success:true,data:...} –

2

如果解析函数失败,您可能会想要向用户显示相应的内容(如错误消息)。 让你的解析函数返回一个承诺(没有then)并使用内部事件$routeChangeError会更好。

myApp.run(['$rootScope',function($rootScope) { 
    $rootScope.$on('$routeChangeError', function() { 
    // what you want to do if an error occurs 
    // ex: $rootScope.displayErrorMessage = true 
    }); 

])

这也将是容易对付一般性错误(如网络错误/服务器停机等)。