所以...我正在尝试学习一些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失败。但正如我所看到的,它应该是不必要的。
你能指出我正确的方向吗?
答案 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
)将正常执行,您的视图将被加载。
还有改进的余地,但我认为这对您有用。
希望有助于或至少指出正确的方向。