#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
как, например.