Пользовательский интерфейс-маршрутизатор для angular, похоже, кэширует разрешение. Когда я этого не хочу

#javascript #angularjs #angular-ui-router #restangular

#javascript #angularjs #angular-ui-router #restangular

Вопрос:

Фон:

Я использую пользовательский интерфейс-маршрутизатор для своих нужд маршрутизации страницы Angular. Пока все работает отлично, однако я сталкиваюсь с проблемой. Когда я загружаю состояние и разрешаю свой пользовательский объект. Я использую restangular для выполнения вызова базы данных, и он возвращает обещание. Все работает отлично. Если я затем выхожу из системы и вхожу в систему как другой пользователь. Затем перейдите обратно на ту же страницу, на которой показан предыдущий пользовательский объект.

Вещи, которые я обнаружил:

  • Вызов rest api выполняется каждый раз, когда загружается состояние, и это правильная информация.
  • Если я помещаю точку останова внутри своего контроллера, пользовательский объект, который передается при разрешении, является кэшированной информацией.

Теории:

  • Конечная точка rest API — это / users / me / , которая является одной и той же конечной точкой для каждого пользователя. Мы просто доставляем другую информацию на основе передаваемого нами токена JWT. Где-то должны быть вещи, поскольку это один и тот же вызов, не утруждайте себя доставкой товаров, которые он уже получил.

Вещи, которые я пробовал:

  • Я подтвердил, что вызов API не кэшируется, и он доставляет правильную информацию в angular
  • Я попытался захватить $ CacheFactory из $ http и .removeAll.

Пример кода:

 angular.module('services.user', [ ])
  .factory('User', function(Restangular) {
    return Restangular.service('users');
  });

angular.module('settings.profile', [
  'ui.router',
  'services.user'
])

.config(function($stateProvider){
  $stateProvider
    .state('settings.profile',{
      url: '/profile',
      templateUrl: 'app/settings/profile/settings.profile.html',
      controller: 'SettingsProfileCtrl',
      authenticate: true,
      resolve: {
        user: function(User) {
          var user = User.one('me').get()
          return user;
        }
      }
    });
})

.controller('SettingsProfileCtrl',
  function($scope, $location, user, $http, apiUrl){

  $scope.user = user;
}
  

Комментарии:

1. Вы чего-нибудь добились с этим? Мне пришлось поместить часть моих ресурсов в мои контроллеры из-за этого мусора.

2. те же вопросы, что и у @Rell выше, эта проблема вызывает у меня проблемы. В моем случае даже нет вызова API — правильные данные (кэшированные в другом месте приложения) возвращаются через обещание, но пользовательский интерфейс-маршрутизатор выдает неправильное разрешение

Ответ №1:

У меня была та же проблема, однако в моем случае данные, запрошенные в свойстве resolve, поступали не из API, поэтому HTTP-кэширование определенно не было проблемой.

Я добавил свойство {reload: true} для options в проблемном $state.go вызове, и это, похоже, заставило ui-router обновить свойство resolve. Я больше не получаю роли и разрешения предыдущего пользователя, что приятно 🙂

Ответ №2:

Ваш параметр REST API не изменяется, т. е. он остается неизменным /users/me/ во всех запросах. Хотя браузер может не кэшировать — вот почему вы видите другую правильную информацию в кэше.

Вы можете попробовать настроить Restangular для проверки теории, выполнив следующие действия:-

 RestangularProvider.setDefaultHttpFields({cache: true});
  

Однако я советую вам использовать URL-адреса и REST API в духе стиля REST, т. Е. использовать что-то вроде…

 /users/me/username
  

где username изменения зависят от пользователя ИЛИ, если у вас есть какие-то ограничения, выполните следующее

 /users/me/?t=timestamp
  

Ответ №3:

Попробуйте добавить cache: false в объект конфигурации состояния. Но я также рекомендую добавлять к запросам другой параметр, такой userId как, например.