我已经决定在我的routeprovider上工作,但我只是回复了承诺,所以我不知道它的成功与否。这就是我所拥有的
.when('/items', {
templateUrl: 'views/items.html',
controller: 'ItemsCtrl',
resolve: {
resolvedData: function(Restangular) {
return Restangular.one('Items').get();
}
}
})
现在这确实有效,但我如何检测成功或失败。我可以在resolve方法中输入它,但是在成功和失败中我会返回什么。记住我需要在我的控制器中注入该项目。
.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;
}
]
}
我真正想做的是在我的控制器中将已解析的变量注入控制器,如果失败那么我还想访问控制器中的故障,这样我就可以向用户显示它是不可能的因问题而渲染。
您只需返回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:
此方法返回一个新的promise,它通过successCallback或errorCallback的返回值解析或拒绝。
如果解析函数失败,您可能希望相应地向用户显示某些内容(如错误消息)。让你的resolve函数返回一个promise(没有then
)并使用内部事件$routeChangeError
会更好。
myApp.run(['$rootScope',function($rootScope) {
$rootScope.$on('$routeChangeError', function() {
// what you want to do if an error occurs
// ex: $rootScope.displayErrorMessage = true
});
])
处理一般错误(如网络错误/服务器关闭等)也会更容易。