我正在使用sbAdmin模板开发一个基于Angular的管理仪表板(我找到了sbAdmin-angular模板)......
问题是我有一个工厂,我从服务器获取数据,控制器可以询问数据(在上次更新中提取)或要求工厂更新它们:
app.factory("appData", function($http, $q) {
var data = null;
var getData = function() {
var defered = $q.defer();
var promise = defered.promise;
if (!data) {
console.log("Fetching data")
updateData().then(function(data) {
defered.resolve(data);
});
} else {
defered.resolve(data);
}
return promise;
}
var updateData = function() {
var defered = $q.defer();
var promise = defered.promise;
$http.get('/appData').success(function(response) {
//Retrieve the data
data = response;
defered.resolve(data);
})});
return promise;
}
return {
getData: getData,
updateData: updateData
};
})
当我更新数据时,每个州使用的控制器,绑定运行良好。但我有一个使用指令实现的侧边栏:
angular.module('sbAdminApp')
.directive('sidebar', ['$location', function() {
return {
templateUrl: 'scripts/directives/sidebar/sidebar.html',
restrict: 'E',
replace: true,
scope: {},
controller: function($scope, appData) {
... bla, bla, bla...
appData.getData().then(function(data) {
$scope.appData = data;
})
... bla, bla, bla...
}
}
}]);
任何人都知道为什么在指令中,工厂(单例)数据不像控制器那样更新?
感谢您的建议!
答案 0 :(得分:1)
请注意,在updateData()
中,如果您从请求中收到错误,则您的承诺既不会解决也不会拒绝。我的猜测是你得到一个错误,因为你没有处理它,请求永远不会完成。
确保updateData
解析或拒绝。通过返回您的承诺而不是创建新的承诺,它可以变得更简单。不要使用已弃用的success
方法,只需将结果视为普通承诺(与then
略有不同,您必须自己提取response.data
{{1}将响应拆分为单独的参数):
success
var updateData = function() {
return $http.get('/appData').then(function(response) {
//Retrieve the data
data = response.data;
return data;
});
}
也可以简化:
getdata
现在来自var getData = function() {
if (!data) {
console.log("Fetching data")
return updateData();
} else {
return $q.resolve(data);
}
}
调用的任何错误都会一直冒回到你的指令,你可以在那里处理它。