我使用angular-ui-router的解决方案从服务器获取数据,在移动到一个状态。有时对服务器的请求失败,我需要通知用户有关失败。如果我从控制器调用服务器,我可以放置然后调用我的通知服务,以防止调用失败。我把调用的服务器解决,因为我想要后代状态等待服务器的结果,他们开始之前。
在调用服务器失败的情况下,在哪里可以捕获错误? (我已经阅读documentation,但仍然不确定如何。此外,我正在寻找一个理由,尝试这个新的代码片段工具:)。
"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;
}]
},"data",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","$http",$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",$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",$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',template: '<div>{{error}}</div><div>{{listvm}}</div>' +
'<a ui-sref="list.detail({id:8})">go to child state and trigger resolve</a>' +
'<ui-view />',$state){
$scope.listvm = { state: $state.current.name };
}]
})
.state("list.detail",$http) {
return $http.get("/").then(function(){ return {status:true,function(){ return {status:false} })
}]
},$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>