繁体   English   中英

Angular.js将错误消息从服务传递到控制器$ scope

[英]Angular.js Passing error message from service to controller $scope

我正在做一个http.post请求,我试图显示错误消息,以防出现任何问题。 我正在处理服务中的错误消息,然后将其传递给控制器​​并在$ scope中设置它。 我没有得到任何JS错误....任何想法为什么会这样?

services.js

angular.module('app.services', [])
.factory('Model', function($http) {

    Model.save = function(data) {
        return $http.post(url, data)
            .success(function(data, status, headers) {
                console.log(data);
                console.log(status);
                console.log(headers);
            })
            .error(function(data, status, headers) {
                var requestError = 'Something went wrong! :(';
                return requestError; //pass error message back to $scope
            });
    }

return Model;

});

controllers.js

.controller('Ctrl', function($scope, Model) {   
//form object data
$scope.formInfo = {};

//form save 
$scope.saveData = function() {
    //console.log($scope.formInfo);

    $scope.requestError = '';

    //form data
    var data = {name: $scope.formInfo.name, description: $scope.formInfo.description, token: "/api/v1/tokens/1/"};

    Model.save(data).then(function(requestError) {
        alert(requestError);
        if (requestError === '') {
            //do nothing for now
        }
        else {
            $scope.requestError = requestError;
        }
    });

};

})

承诺有两个最终状态:已解决(成功)或已拒绝(错误)。

在控制器中,如果要访问两个状态, then()函数需要两个不同的处理程序。 第一个处理程序仅接收来自服务的已解决(成功)承诺。 要处理来自服务的拒绝(错误)承诺,您还需要这样的内容:

Model.save(data).then(function(success) { ... }, function(error) { ... });

如果您出于某种原因只关心错误,请使用其中任何一个(相当于):

Model.save(data).then(null, function(error) { ... });
Model.save(data).catch(function(error) { ... });

在您的服务中,确保在发生错误时实际上已将拒绝(错误)承诺返回给控制器。 您可以使用return $q.reject(requestError)而不是仅return requestError


重要说明:由于您使用的是$http ,因此在HTTP错误的情况下,这将拒绝承诺。 如果您不处理服务中的拒绝(错误)承诺,它们将自动传递给控制器​​的错误处理程序。 您可能希望简单地让$http的拒绝通过,并且在服务中没有错误处理程序。 您只需删除服务中的.error()即可。 这允许控制器直接处理HTTP错误。 (这可能是也可能不是,这取决于你想要做什么样的错误处理)。

我倾向于使用我的HTTP服务的基本模式看起来像这样,它只返回已下载数据的已解决的承诺,或者将$http拒绝的承诺(错误)直接返回给控制器:

return $http.get(config).then(function(success) { return success.data });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM