我使用restful api从mongodb访问json数据,我构建了angularjs工厂如下:
angular.module('myApp').
factory('usersFactory', function($http, $q){
var deffered = $q.defer();
return {
getUsers: function(){
return $http.get('/api/users/').then(function(result){ deffered.resolve(result); return deffered.promise; });
},
getUser: function(nickname){
return $http.get('/api/users/'+nickname).then(function(result){ deffered.resolve(result); return deffered.promise; });
}
};
}).
controller('MainCtrl', function($scope, usersFactory){
var promise = usersFactory.getUsers();
promise.then(function(response){
//success handler
$scope.users= response.data;
},
function(response){
//error handler
$log.error(response);
});
}).
controller('SecondCtrl', function($scope, usersFactory){
$scope.loadUser = function(){
var promise = usersFactory.getUsers($scope.usersFld);
promise.then(function(response){
//success handler
$scope.user= response.data;
},
function(response){
//error handler
$log.error(response);
});
};
});
当我更改用户时,第一个用户显示数据的问题在我进行硬刷新(F5)之前不会显示,有人可以解释为什么会发生这种情况吗?并且数据是否被缓存,所以我需要进行硬刷新以显示新数据?
答案 0 :(得分:1)
您不能重复使用延期。您应该会看到对loadUser()
的调用会立即返回,因为承诺已经解决,$scope.user
应该是您初次调用getUsers()
的结果,因为这就是它的原因解决了。
您可以将var deferred = $q.defer();
移至getUsers()
和getUser()
函数并直接返回承诺,或只返回$http.get
的结果,不要打扰创建自己的延期。
getUsers: function() {
var deferred = $q.defer();
$http.get('/api/users/').then(function(result) {
deferred.resolve(result);
}, function(error) {
deferred.reject(error);
});
return deferred.promise; // result will be what you call resolve() with
},
getUser: function(nickname){
return $http.get('/api/users/'+nickname);
}
答案 1 :(得分:0)
您可以使用观看事件,然后从那里激活您的ajax电话。 [根据数据集的大小,您可以通过第一次调用获得所需的用户数据,然后您只需执行一次$ http获取。]
//my suggestion if the dataset is not to big
//$scope.Users = ajax call getting all user data
//var index = 'find index of user by ...'
//$scope.User = $scope.Users[index]
controller('SecondCtrl', function($scope, usersFactory){
scope.$watch("usersFld", function (newValue, oldValue) {
$scope.loadUser = function(){
var promise = usersFactory.getUsers($scope.usersFld);
promise.then(function(response){
//success handler
$scope.user= response.data;
},
function(response){
//error handler
$log.error(response);
});
};
});