范围变量未从AngularJS中的函数内的$ http响应中分配

时间:2017-01-21 14:48:51

标签: javascript angularjs

我知道这里已经讨论了许多类似的问题,但没有一个答案帮助我解决了我的具体问题。我有一个函数,我在其中执行$ http get请求。我还在函数中传递一个对象作为参数。在成功的响应中,我看到了正确的数据,并尝试将其分配给我正在传递的外部变量。但来自响应的数据似乎并没有“逃脱”功能之外。外部变量也是范围变量。我不直接使用它,因为该功能应该被层次结构中的其他控制器使用。 这是功能:

$scope.getUser = function (userID, userData) {
    var response = $http({
        method: "GET",
        url: ("user/" + userID),
        responseType: "json"
    })
        .then(
        function (response) { //success
            return response.data;
        },
        function (response) { //error
            alert(response.data.message);
            return undefined;
        })
            .then(function (data) {
                userData = data;
            });
};

基本上我正在尝试将结果分配给userData,如下所示:

$scope.user = {} //in the beginning of the controller.
//.....
$scope.getUser(1, $scope.user);

之后$ scope.user仍未触及。 我也尝试将其放在 $ apply 函数中,但结果仍然相同。 如果我将$ scope.user放在函数内而不是userData参数中,一切正常,但就像我说的那样,这不是函数的目的。它应该能够处理任何变量。我正在使用角度ui路由器,此功能所在的控制器位于层次结构的顶部,所有其他控制器应该访问它并使用它从数据库中获取用户。

2 个答案:

答案 0 :(得分:1)

你问题中提到的方法不是有效方法,我建议你等待控制器函数中的结果进行任何$ scope分配。

试一试

$scope.getUser = function (userID) {
    return $http({
        method: "GET",
        url: ("user/" + userID),
        responseType: "json"
    }).then(function (results) {
        return results.data;
    });;
}

//and call it from your controller like

$scope.getUser(1).then(function (data){
    //perform any data validations here
    $scope.user = data;
});

答案 1 :(得分:0)

修改函数的输入参数并不能保证它也会更新函数的调用者,并且它不是一个好的编程模式。

您可以考虑将更新委托传递给包含更新所需数据逻辑的函数。例如,这是一个修订的getUser函数

$scope.getUser = function (userID, updateUserDataDelegate) {
    var response = $http({
        method: "GET",
        url: ("user/" + userID),
        responseType: "json"
    }).then(
        function (response) { //success
            updateUserDataDelegate(response.data);
        },
        function (response) { //error
            alert(response.data.message);
            return undefined;
        }
    );
};


$scope.user = {} //in the beginning of the controller.

var updateScopeUserDelegate = function( userData ) {  $scope.user = userData; };
$scope.getUser(1, updateScopeUserDelegate);