userServic不会将数据传递到后端:无法读取的未定义的属性“协议” - AngularJS

2019-10-20 19:20发布

我有我的用户控制面板更改密码功能,不能正常工作。 它挑选的最多值从输入和控制器服务并将它们传递,服务接收他们,但是当他treys打后端与他们调试控制台的回报:无法读取属性未定义的“协议”。

重要提示:请参阅我的预览问题在这里 ,你写你的解决方案,以了解为什么我必须使用对象的领域范围输入之前。 普莱斯认为发送整个对象到后端是不是一种选择,谢谢。

表格档案(.html):

<accordion-group heading="Change password" is-open="changePasswordStatus.open" style="cursor: pointer">
    <div>
        <div>
            <form class="form-horizontal" role="form">
                <form-row model="password.newPassword" name="New: " size="col-sm-8"></form-row>
                <form-row model="password.repeatedNewPassword" name="Repeat: " size="col-sm-8"></form-row>
                <form-row model="password.currentPassword" name="Current: " size="col-sm-8"></form-row>
                <br>
            </form>
        </div>
        <div>
            <button class="btn btn-default btn-sm" data-ng-click="changePassword()">Save</button>
            <button class="btn btn-warning btn-sm" ng-click="changePasswordStatus.open = !changePasswordStatus.open">Cancel</button>
        </div>
    </div>
</accordion-group>

userController.js:

collectionsApp.controller('userController', function($scope, userService, $timeout, $state) {
    $scope.password = {
        newPassword : "",
        repeatedNewPassword : "",
        currentPassword : ""
    }

    $scope.init = function() {
        userService.getCurrentUser(getCurrentUser);
    }

    $scope.changePassword = function() {
        if ($scope.password.newPassword === $scope.password.repeatedNewPassword) {
            userService.changePassword($scope.password.newPassword, $scope.password.currentPassword);
    }
}

...

userService.js:

collectionsApp.service('userService', function($http) {
    return {
        changePassword : function(newPassword, currentPassword) {
            $http.post('/user/changePassword', newPassword, currentPassword);
        }

    };
});

调试:

错误控制台:

Answer 1:

按照$ HTTP参考 ,POST方法的参数是

  1. 网址
  2. 数据对象
  3. 选择对象

所以,试试这个:

collectionsApp.service('userService', function($http) {
    return {
        changePassword : function(newPassword, currentPassword) {
            var data = {
                newPassword: newPassword,
                currentPassword: currentPassword
            };
            $http.post('/user/changePassword', data);
        }

    };
});


Answer 2:

我设法解决这个问题。 有三种解决方案。 在后端我有一个配置为接受与POST方法@RequestBody Java的控制器。 首先它配置了两个字符串,但因为它发生角的$ HTTP POST是旨在接收三个PARMS - (如@RémiB指出)1.网址,2.data,3.配置对象。 因此,合理的解决方案是发送对象,并获得这就像一个普通的物体Object data ,但这个对象没有getter和setter所以这是不可能的提取数据。 绝对不可以接受的解决方案是创建一个专为这类数据的getter和setter实用工具类。 少不能接受的解决办法是新日提交(NEWPASSWORD到现有类用户)添加所以与此类接收到的数据可被处理。 三 - 可疑的解决办法是接收数据作为通用Object对象,做一个toString()OND该对象并写代码从字符串中提取子。 这听起来真的错了,我不希望这样做。 最后的解决办法是至少不可接受:改变方法来获取和url中发送数据(从角服务)和反应作为通过在Java后端@PathVariables字符串。 所以,长话短说:

changePassword : function(newPassword, currentPassword) {
    $http.get('/user/changePassword/'+newPassword+'/'+currentPassword);
}

而在后端:

@RequestMapping(value = "/changePassword/{newPassword}/{currentPassword}", method = RequestMethod.GET)
    public HashMap<String, String> changePassword(@PathVariable("newPassword") String newPassword, @PathVariable("currentPassword") String currentPassword) {  
....
}


文章来源: userServic won't pass data to back-end: Cannot read property 'protocol' of undefined - AngularJS