在我的Angular应用程序中,我有一个baseController.js
类和一个类exampleController.js
,它可以通过将自己的范围注入baseController来访问baseController
中定义的函数。这允许所有控制器之间的共享功能。
这是有效的,除了我尝试从getDataFromUrl()
调用exampleController
函数的情况。在调试时,我可以看到getDataFromUrl()
被调用,并且它进入.success()
调用的$http.get()
函数。那时我可以看到data
是一个反序列化的JSON对象(在这种情况下,它是一个对象数组)但是当代码最终回到exampleController
的{{1}}函数时它最终收到的initArray()
不再是反序列化的对象,而是变成了原始的HTTP响应数据。
baseController.js:
data
exampleController.js:
// Data retrieval function for all derived controllers
$scope.getDataFromUrl = function (url) {
return $http.get(url)
.success(function (data) {
return data;
})
.error(function () {
return null;
});
};
为什么appModule.controller('exampleController', [
'$scope', '$controller', '$http', '$window', '$location', '$timeout',
function ($scope, $controller, $http, $window, $location, $timeout) {
var base = $controller('baseController', { $scope: $scope });
// Initiate an array of data
var initArray = function (data) {
$scope.sortedArray = sortDataByDate(data);
};
// Calling function in scope defined by base controller class
$scope.getDataFromUrl('resources/data').then(function (data) {
initArray(data);
});
}]);
作为HTTP响应返回data
?我想让它保持反序列化的JSON!
答案 0 :(得分:1)
success
和error
回调不属于您的getDataFromUrl()
功能。此外,您不能像异步调用那样将数据返回给调用者。相反,该函数应该返回对$http
调用的承诺,然后从调用者处理成功。这是一种方法。
$scope.getDataFromUrl = function (url) {
// return a promise to the async action and handle `success` and `error` in the caller
return $http.get(url);
};
// for example
$scope.getDataFromUrl('resources/data').then(function (data) {
initArray(data);
});
// or
$scope.getDataFromUrl('resources/data').success(function (data) {
initArray(data);
}).error(function() {
alert('Server error');
});
答案 1 :(得分:0)
想出来,我得到原始响应数据,因为.then()
.success()
不会因// Data retrieval function for all derived controllers
$scope.getDataFromUrl = function (url, successFunction) {
$http.get(url)
.success(function (data) {
successFunction(data);
})
.error(function () {
return null; // Or whatever you want to return
});
};
而触发,因此到达子控制器的数据从未反序列化。这是正确的代码:
<强> baseController.js:强>
appModule.controller('exampleController', [
'$scope', '$controller', '$http', '$window', '$location', '$timeout',
function ($scope, $controller, $http, $window, $location, $timeout) {
var base = $controller('baseController', { $scope: $scope });
// Initiate an array of data
var initArray = function (data) {
$scope.sortedArray = sortDataByDate(data);
};
// Calling function in scope defined by base controller class
$scope.getDataFromUrl('resources/data', function (data) {
initArray(data);
});
}]);
<强> exampleController.js:强>
{{1}}