2015-08-05 4 views
2

В моем процессе регистрации приложения AngularJS я постоянно обновляю объект пользователя.

Возможно, это неправильный способ сделать это, но я использую один «регистрационный» контроллер для всех этих шагов регистрации (так как логика на шагах очень схожа, и она делает более аккуратный код, а не делает отдельный «signup1», «signup2» и т.д. контроллер для каждого вида

Я обещаю, что возвращает userInfo из моей базы данных:.

.service('userInfo', function ($http, $cookies) { 
     var userId = $cookies.id; 
     console.log("UI Cookies", $cookies); 

    var promise = $http.get('/api/findProfile/' + userId, { cache: false}). 
     success(function (data) { 
      var userInfo = data; 
      console.log("This is fresh data!") // This logs the first time I load my page, but never again 
      return userInfo; 
     }).error(function(data) { 
      console.log("ERROR") 
      return userInfo 
     }); 
     return promise; 

}) 

При переходе от одного шага регистрации к следующему, я обновить профиль профиля на MongoDB, затем загрузите следующую страницу. Если я загружу страницу с помощью изменения $location('') с моего контроллера, я старую userInfo, который не обновляется в моей базе данных. Однако, если я полностью обновляю страницу, я получаю правильный, обновленный userInfo.

Это проблема с кешированием? Я попытался прохождения {cache: false} моих $http обещания, но я не получаю свежие данные (как обозначено console.log("This is fresh data!"), скорее, я получаю кэшированные данные обратно

Как я могу решить эту проблему за принуждать всю страницу. перезагружать в Угловом?

ответ

4

Это не проблема кэширования, или, по крайней мере, не так, как вы думаете.

Services and factories are singletons in angular, что означает, что они инициализируются один раз, прежде чем они будут первым предложено вводить. После этого, сервис-функция не будет запущена, все контроллеры получат один и тот же объект. (В случае службы создается введенный объект используя служебную функцию в качестве конструктора)

Если вы хотите опросить некоторые данные при каждом просмотре представления, вам необходимо инициализировать запрос в контроллере (вы можете сделать это с помощью службы независимо) - который перезагружается страница браузера.


Кроме того, у вас, похоже, есть проблемы с использованием обещаний и возвращаемых значений. Нет смысла возвращаться из обработчиков ошибок и успехов, поскольку их возвращаемое значение будет отброшено. См. this discussion для получения дополнительной информации о «возврате» из асинхронных функций.

Это, вероятно, будет проще, если вы просто вернуть $http обещание из функции в службе, то каждый контроллер может обрабатывать обещание надлежащим образом, в конечном счете, уменьшая код службы к этому:

.service('userInfo', function ($http, $cookies) { 
    var userId = $cookies.id; 
    console.log("UI Cookies", $cookies); 

    //this function returns the promise returned by $http.get 
    this.getData = function(){ 
     return $http.get('/api/findProfile/' + userId, { cache: false}); 
    }; 
}) 
+0

Ах, что имеет смысл, Я подумал, что это сойдет на меня, не понимая, как работают службы на самом деле! Так вы предлагаете просто загружать в '' http.get() 'вызов в мой контроллер, так что это новый набор данных каждый раз? – Jascination

+0

Поцарапайте это, вы обновили его в своем ответе. Привет, дружище, понял! – Jascination

+0

@ Привлекательность обоих подходов жизнеспособна, если вы хотите повторно использовать этот HTTP-запрос в других контроллерах, лучше переместить его в службу (возможно, также лучше с точки зрения проверки). Вы можете создать функцию в сервисе, которая при каждом вызове возвращает новое обещание. – doldt