2014-12-26 3 views
0

я доступ к данным JSON из MongoDB с помощью RESTful API, я построил 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

Как вы изменяете данные пользователей? –

+0

Список пользователей - это база данных i, и я показываю пользователям и информацию о пользователе в соответствии с URL-адресом, если URL содержит только '/ users', он будет генерировать $ http-запрос и получает данные, если он содержит'/users/john' на странице будет отображаться информация о john. Проблема, с которой я сталкиваюсь, когда я получаю информацию о нем и нажимаю обратно и выбираю другого пользователя, страница пользователя все еще отображает информацию о нем, пока я не сделаю жесткое обновление. –

+0

Хорошо, как вы управляете своим переходом на URL? Вы используете ui-router или что-то еще? Как отображаются эти два контроллера? –

ответ

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); 
} 
+0

thanx проблема была с дефферируемой переменной, когда я просто установил ее для функции getUsers. работал отлично, не обновляя страницу, thanx –

0

Вы можете использовать событие часового пояса, а затем запустить свой аякс-вызов оттуда. [В зависимости от размера набора, вы могли бы получить UserData вам нужно с первым звонком, а затем вы могли бы сделать только один $ HTTP GET.]

//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); 
     }); 
     }; 
    }); 
Смежные вопросы