Angularjs 1.5.x обменивается данными с сервисом между компонентами

#angularjs #service #components #init #message-passing

#angularjs #Обслуживание #Компоненты #инициализация #передача сообщений

Вопрос:

Я довольно новичок в angularjs и хотел бы задать несколько вопросов. Я работаю над проектом, в котором мне нужно получить объект формы с сервера. Форма представляет собой сложный древовидный объект со многими слоями, и я создал 4 разных компонента / вкладки для привязки к соответствующим объектам. Я создал сервис для получения данных.

 angular.module('myService', ['restangular'])
        .factory('FormService', ['Restangular', '$q', function(Restangular, $q) { 

    function FormService() {
        var self = this;
        self.form = null;

        self.getForm = function getForm(id)
        {
            var deferred = $q.defer();
            if (self.form !== null)
            {
                deferred.resolve(self.form);
                console.log("Cache!");
            }
            else {
                Restangular.one('form', id).get()
                  .then(function successCallback(response)
                  {
                    self.form = response;
                    deferred.resolve(response);
                    console.log("from server!");

                  }, function errorCallback(response) {
                    deferred.reject(response);
                    console.log("error, cannot resolve object");
                  });
            }
            return deferred.promise;
        }

      return new FormService();
  }])
});
  

Затем у меня были все мои компоненты с аналогичной конфигурацией ниже:

 angular.module('page1Summary', ['formService']).component('page1Summary', {
  templateUrl: 'page1-summary/page1-summary.template.html',
  controller: ['FormService', function Page1SummaryController(FormService) {
    var ctrl = this;

    // ******* Init Params Start *********** //
    this.$onInit = function() {
      // init value when object ready
      FormService.getForm()
        .then(
          /* on success */
          function successCallback(data) {
            console.log("page1-summary init");
            ctrl.form = data;
            console.log("page1-summary got the data");
        },
          /* on error */
          function errorCallback(data)
          {
              console.log("failed to get form");
          }
      );
    }

    /* other stuff here */
 }
  

Я печатал либо «кэш!», либо «с сервера» в службе getForm. Чтобы я мог выяснить, извлекаю ли я данные с сервера или из памяти. Однако каждый раз, когда я обновляю, результат отличается. Иногда данные сохраняются в локальной переменной в сервисе и «кэшируются», но иногда некоторые из моих страниц получают данные «с сервера».

Я хотел бы знать, что происходит не так? Я думал, что только в первый раз служба получит доступ с сервера, но, похоже, это не так.

Может кто-нибудь, пожалуйста, помочь мне и указать, что я сделал не так?

Заранее спасибо!

Ответ №1:

Вы кэшируете свой результат в self.form . self.form снова является FormSerivce элементом переменной Factory. Он будет кэшировать результат до тех пор, пока вы не обновите страницу. Как только вы обновите страницу, значение в self.form будет сброшено, как и все другие переменные в вашем приложении.

Вместо того, чтобы кэшировать результат self.form , кэшируйте его localstorage . Таким образом, вы можете получить результат обратно даже после обновления страницы.