我参加了AngularJS的在线课程,我正在学习它的第一步。
我尝试在表单提交后调用API并基于API响应,显示并隐藏一些数据。
我首先尝试做的是检查状态响应,以防它为无效的API调用返回500错误。但是,我似乎无法做到。
我的服务文件的一部分:
service.getMenuItem = function (shortName) {
return $http.get(ApiPath + '/menu_items/' + shortName + '.json')
.then(function successCallback(response) {
return response.data;
}, function errorCallback(response) {
return response.status;
})
};
在我的控制器上:
SignupController.$inject = ['MenuService'];
function SignupController(MenuService) {
var signupCtrl = this;
signupCtrl.submit = function () {
signupCtrl.response = MenuService.getMenuItem(signupCtrl.user.favouritedish);
if ( signupCtrl.response == 500 ) {
signupCtrl.dishError = true;
}
};
}
如果我在$ http调用中没有任何错误,那么一切正常。但是,由于500错误,它似乎没有。我尝试在我的控制器上记录signupCtrl.response
,value: 500
就在那里。但是if无法验证。
AngularJS的1.5.8版
答案 0 :(得分:4)
您的getMenuItem函数返回一个promise,而不是已解析的值。 所以只需使用"然后"在它上面,检查已解决的值。
$('.outerLabel').on("click", function() { allowLabelClick(this); });
希望有所帮助。 顺便说一下,这段代码可能令人困惑,因为" 500"可能是一个" response.data"合法的回应。 因此,最好不要提出错误"回调并让调用服务自己处理错误。 e.g。
MenuService.getMenuItem(signupCtrl.user.favouritedish).then(
function(response) {
if (response === 500) {
signupCtrl.dishError = true;
}
}
);
答案 1 :(得分:1)
使用.then()链接方法调用服务函数。
SignupController.$inject = ['MenuService'];
function SignupController(MenuService) {
var signupCtrl = this;
signupCtrl.submit = function() {
MenuService.getMenuItem(signupCtrl.user.favouritedish)
.then(function(result) {
console.log(result.data)
}, function(error) {
console.log(error.data)
})
};
}
答案 2 :(得分:0)
$http
服务不会返回承诺。它将返回其success
或error
的回调函数。所以你的服务应该是这样的:
function getMenuItem() {
var deferred = $q.defer();
$http.get(serviceBase + '/api/itemId').success(function (result) {
deferred.resolve(result);
}).error(function (err) {
deferred.reject(err.status);
});
return deferred.promise;
}
所以在这种情况下,如果成功,您将解析结果。或者如果失败,您将解决状态。
在您的控制器中,您应该执行以下操作:
SignupController.$inject = ['MenuService'];
function SignupController(MenuService) {
var signupCtrl = this;
signupCtrl.submit = function () {
signupCtrl.response = MenuService.getMenuItem(signupCtrl.user.favouritedish).then(function(response){
//to do if it success
}, function(errorStatus){
signupCtrl.dishError = true;
// to do with the error status
};
}