Очистить историю и перезагрузить страницу при входе/выходе из системы с использованием Ionic Framework
Я новичок в разработке мобильных приложений с помощью Ionic. При входе в систему и выходе из системы мне нужно перезагрузить страницу, чтобы обновить данные, однако $state.go('mainPage')
возвращает пользователя к просмотру без перезагрузки - контроллер за ним никогда не вызывается.
Есть ли способ очистить историю и перезагрузить состояние в Ionic?
Ответы
Ответ 1
Добро пожаловать в рамки! На самом деле маршрутизация в Ionic работает от ui-router. Вероятно, вы должны проверить этот предыдущий вопрос SO, чтобы найти несколько способов для этого.
Если вы просто хотите перезагрузить состояние, которое вы можете использовать:
$state.go($state.current, {}, {reload: true});
Если вы действительно хотите перезагрузить страницу (например, вы хотите перезагрузить все), вы можете использовать:
$window.location.reload(true)
Удачи!
Ответ 2
Я обнаружил, что ответ JimTheDev работает только тогда, когда установлено определение состояния cache:false
. С кешированным представлением вы можете сделать $ionicHistory.clearCache()
, а затем $state.go('app.fooDestinationView')
, если вы переходите от одного состояния к тому, которое кэшировано, но нуждается в обновлении.
См. мой ответ здесь, поскольку для этого требуется простое изменение в Ionic, и я создал запрос на перенос: fooobar.com/questions/27120/...
Ответ 3
Я нашел решение, которое помогло мне сделать это. Установка cache-view="false"
в теге ion-view
разрешила мою проблему.
<ion-view cache-view="false" view-title="My Title!">
....
</ion-view>
Ответ 4
Правильный ответ:
$window.location.reload(true);
Ответ 5
Перезагрузить страницу не лучший подход.
вы можете обрабатывать события изменения состояния для перезагрузки данных без перезагрузки самого представления.
читайте о жизненном цикле ionicView здесь:
http://blog.ionic.io/navigating-the-changes/
и обработать событие beforeEnter для перезагрузки данных.
$scope.$on('$ionicView.beforeEnter', function(){
// Any thing you can think of
});
Ответ 6
В моем случае мне нужно очистить только представление и перезапустить контроллер. Я мог бы получить мое намерение с помощью этого фрагмента:
$ionicHistory.clearCache([$state.current.name]).then(function() {
$state.reload();
}
Кэш все еще работает и кажется, что только вид очищается.
ionic --version
говорит 1.7.5.
Ответ 7
Ни одно из упомянутых выше решений не работало для имени хоста, которое отличается от localhost
!
Мне пришлось добавить notify: false
в список параметров, которые я передаю в $state.go
, чтобы избежать вызова сменщика Angular, перед вызовом вызова $window.location.reload
. Окончательный код выглядит следующим образом:
$state.go('home', {}, {reload: true, notify: false});
→ > EDIT - может потребоваться $timeout в зависимости от вашего браузера → >
$timeout(function () {
$window.location.reload(true);
}, 100);
< < < КОНЕЦ ИЗМЕНЕНИЯ <
Подробнее об этом на ссылка ui-router.
Ответ 8
Я пытался обновить страницу с помощью angularjs, когда увидел сайты, которые я запутался, но код не работал для кода, тогда я получил решение для перезагрузки страницы, используя
$state.go('path',null,{reload:true});
используйте это в функции, которая будет работать.
Ответ 9
Мне нужно было перезагрузить состояние, чтобы заставить полосы прокрутки работать. Они не работали, когда шли через другое государство - "регистрация". Если приложение было принудительно закрыто после регистрации и открыто снова, то есть оно перешло непосредственно в состояние "домой", прокрутки работали. Ни одно из вышеперечисленных решений не работало.
Когда после регистрации я заменил:
$state.go("home");
с
window.location = "index.html";
Приложение перезагрузилось, и прокрутки работали.
Ответ 10
Контроллер вызывается только один раз, и вы ДОЛЖНЫ сохранить эту логическую модель, что я обычно делаю:
Я создаю метод $scope.reload(params)
В начале этого метода я вызываю $ionicLoading.show({template:..})
, чтобы показать свой собственный счетчик
Когда процесс перезагрузки завершен, я могу вызвать $ionicLoading.hide()
как обратный вызов
Наконец, внутри кнопки REFRESH добавьте ng-click = "reload(params)"
Единственным недостатком этого решения является то, что вы потеряли систему истории ионной навигации
Надеюсь, это поможет!
Ответ 11
Если вы хотите перезагрузить после изменения вида, вам нужно
$state.reload('state',{reload:true});
Если вы хотите сделать это представление новым "root", вы можете указать, что следующий вид будет корневым
$ionicHistory.nextViewOptions({ historyRoot: true });
$state.go('app.xxx');
return;
Если вы хотите, чтобы ваши контроллеры перезагрузились после изменения каждого вида
app.config(function ($stateProvider, $urlRouterProvider, $ionicConfigProvider) {
$ionicConfigProvider.views.maxCache(0);
Ответ 12
.state(url: '/url', контроллер: Ctl, templateUrl: 'template.html', cache: false)
cache: false == > решена моя проблема!
Ответ 13
Как указано контроллерами перезагрузки @ezain только тогда, когда это необходимо. Другим более чистым способом обновления данных при изменении состояний, а не при перезагрузке контроллера, является использование широковещательных событий и прослушивание таких событий в контроллерах, которым необходимо обновлять данные на представлениях.
Пример: в ваших функциях входа/выхода вы можете сделать что-то вроде этого:
$scope.login = function(){
//After login logic then send a broadcast
$rootScope.$broadcast("user-logged-in");
$state.go("mainPage");
};
$scope.logout = function(){
//After logout logic then send a broadcast
$rootScope.$broadcast("user-logged-out");
$state.go("mainPage");
};
Теперь в вашем mainPage-контроллере триггер изменений в представлении с помощью функции $on для прослушивания широковещательной передачи в mainPage Controller следующим образом:
$scope.$on("user-logged-in", function(){
//update mainPage view data here eg. $scope.username = 'John';
});
$scope.$on("user-logged-out", function(){
//update mainPage view data here eg. $scope.username = '';
});
Ответ 14
Я пробовал много методов, но нашел этот метод абсолютно правильным:
$window.location.reload();
Надеюсь, что эта помощь поможет другим застрять в течение нескольких дней, как я, с версией: angular 1.5.5, ionic 1.2.4, angular -ui-router 1.0.0