我知道这里已经讨论了许多类似的问题,但没有一个答案帮助我解决了我的具体问题。我有一个函数,我在其中执行$ 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路由器,此功能所在的控制器位于层次结构的顶部,所有其他控制器应该访问它并使用它从数据库中获取用户。
答案 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);