(注意:这是AngularJs,但应该是"标准" Javascript-Issue)
我使用以下方法读取角度控制器内的json文件的内容:
$http.post(apiUrl + 'data.php?select', {directory: "customers", file: "john"})
.success(function (data) {
$scope.customers= data;
})
(php - 函数只返回一个(有效的)JSon-Array)。
这按预期工作;内容存储在$ scope.customers
中因为在不同的地方需要这种行动,我决定为此写一项服务:
myApp.factory('util', function ($http) {
return {
getFile:function(directory, file, target) {
$http.post(apiUrl + 'data.php?select', {directory: directory, file: file})
.success(function (data) {
target = data;
});
}
};
然后按照以下方式调用此方法:
util.getFile("customers","john",$scope.customers);
但是这不起作用($ scope.customers保持为空)。
在深入研究之后我明白这不能以这种方式工作,因为数组不是通过引用而是通过值传递的。
但还有另一种方法可以达到我想要的目的吗?
答案 0 :(得分:2)
我认为问题是目标现在是一个局部变量,因为javascript总是按值传递,所以在这种情况下,target引用了像$ scope.customers这样的同一个对象。但是覆盖目标不会覆盖$ scope.customers,然后target只会指向另一个对象。
您应该使用.then(result)设置变量:
myApp.factory('util', function ($http) {
return {
getFile:function(directory, file, target) {
return $http.post(apiUrl + 'data.php?select', {directory: directory, file: file})
}
};
并用
调用它util.getFile("customers","john").then(function successCallback(response) {
// this callback will be called asynchronously
// when the response is available
$scope.customers = response.data;
}, function errorCallback(response) {
// called asynchronously if an error occurs
// or server returns response with an error status.
console.log("Error getting customers")
});
这也清楚表明util.getFile是一个异步函数,你可以在这里放置代码,当结果可用时执行。
注意:另一种替代方法是覆盖对象的属性(但我更喜欢上面的方法):
myApp.factory('util', function ($http) {
return {
getFile:function(directory, file, target) {
$http.post(apiUrl + 'data.php?select', {directory: directory, file: file})
.success(function (result) {
target.data = result.data;
});
}
};