我有一个服务,其中包含一个设置和返回默认用户首选项的功能。我遇到一个奇怪的问题,我认为这与返回数据的异步性质有关。我会告诉你电话,然后解释问题。
服务定义如下:
var StateService = angular.module('StateService', [])
.service('HoldState', function ($http, $q) {
在app.js中我有以下注射:
var JBenchApp = angular.module('JBenchApp', [
'ngRoute',
'StateService'
]);
在控制器中我也有以下注射:
JBenchApp.controller('CaseListCtrl', ['$scope', '$http', 'HoldState',
function ($scope, $http, HoldState) {
以下是我打电话的功能:
this.getUserDefaults = function (UserID) {
var userDefaults = [], deferred = $q.defer();
$http.get('http://10.34.34.46/BenchViewServices/api/UserPreference/Default/' + UserID)
.then(function (response) {
userDefaults = response;
//var status = getStatus();
var status = localStorage.getItem('Status');
// If the status is 0 then we have not yet navigated anywhere so we will need to set the path values to be
// the same as the default. We do nothing if status is not 0 because it means we already have path values set
if (status == 0 || status == null) {
/**setTypeOfLaw(response.LitigationCode);
setCourthouse(response.LocID);
setDepartment(response.CourtRoom);**/
localStorage.setItem('LawType', response.LitigationCode);
localStorage.setItem('Building', response.LocID);
localStorage.setItem('Dept', response.CourtRoom);
localStorage.setItem('Status', 1);
}
alert("value: " + userDefaults.PreferenceID);
deferred.resolve(response);
}, function (response) {
console.log(response.status + " -- " + response.data + " -- " + response.statusText);
});
return deferred.promise;
};
以下是我看到这个奇怪问题的代码:
$scope.fillDefaults = function () {
HoldState.getUserDefaults('dpeng').then(function (data) {
$scope.userDefaults = data;
//$scope.$apply();
});
}
$scope.fillDefaults();
我看到的问题是调用并输入了该函数。然后处理返回到$ scope.userDefaults行,但它结束未定义。似乎代码在返回数据之前通过$ scope.fillDefaults函数。我怀疑这是因为警报错误说它无法找到未定义的属性PreferenceID。我通过PostMan检查了API调用,它工作得很好。我在这里做错了什么?
答案 0 :(得分:0)
fillDefaults
是一只红鲱鱼;问题出在getUserDefaults
:您将http.get
的完整回复对象分配给userDefaults
,而不是回复数据。
$http.get('http://10.34.34.46/BenchViewServices/api/UserPreference/Default/' + UserID)
.then(function (response) {
userDefaults = response;
应该是
$http.get('http://10.34.34.46/BenchViewServices/api/UserPreference/Default/' + UserID)
.then(function (response) {
userDefaults = response.data;