Очистить историю и перезагрузить страницу при входе / выходе с помощью Ionic Framework
Я новичок в разработке мобильных приложений с ионной. При входе и выходе из системы мне нужно перезагрузить страницу, чтобы обновить данные, однако,$state.go('mainPage')
возвращает пользователя в представление без перезагрузки-контроллер за ним никогда не вызывается.
есть ли способ очистить историю и перезагрузить состояние в Ionic?
14 ответов
Добро пожаловать в основу! На самом деле маршрутизация в Ionic питается от ui-router. Вы, вероятно, должны проверить это предыдущий, так что вопрос найти несколько различных способов сделать это.
Если вы просто хотите, чтобы перезагрузить, вы можете использовать:
$state.go($state.current, {}, {reload: true});
Если вы действительно хотите перезагрузить страницу (как в, вы хотите перезагрузить все), то вы можете использовать:
$window.location.reload(true)
удачи!
я обнаружил, что ответ Джимтхедева работал только тогда, когда определение состояния было cache:false
set. С помощью кэшированного представления вы можете сделать $ionicHistory.clearCache()
а то $state.go('app.fooDestinationView')
Если вы переходите из одного состояния в другое, которое кэшируется, но нуждается в обновлении.
см. мой ответ здесь, поскольку он требует простого изменения на Ionic, и я создал запрос на вытягивание:https://stackoverflow.com/a/30224972/756177
Я нашел решение, которое помогло мне сделать это. Настройка cache-view="false"
on ion-view
тег решил мою проблему.
<ion-view cache-view="false" view-title="My Title!">
....
</ion-view>
перезагрузить страницу-не лучший подход.
вы можете обрабатывать события изменения состояния для перезагрузки данных без перезагрузки самого представления.
читать про жизненный цикл ionicView здесь:
http://blog.ionic.io/navigating-the-changes/
и обрабатывать событие beforeEnter для перезагрузки данных.
$scope.$on('$ionicView.beforeEnter', function(){
// Any thing you can think of
});
в моем случае мне нужно просто посмотреть и перезапустить контроллер. Я мог бы получить свое намерение с помощью этого фрагмента:
$ionicHistory.clearCache([$state.current.name]).then(function() {
$state.reload();
}
кэш все еще работает и кажется, что только представление очищено.
ionic --version
говорит 1.7.5.
ни одно из решений, упомянутых выше, не работало для имени хоста, которое отличается от localhost
!
мне пришлось добавить notify: false
в список опций, которые я передаю $state.go
, чтобы избежать вызова слушателей угловых изменений, прежде чем $window.location.reload
вызова вызывается. Окончательный код выглядит так:
$state.go('home', {}, {reload: true, notify: false});
>>> EDIT- $ timeout может потребоваться в зависимости от Вашего браузера >>>
$timeout(function () {
$window.location.reload(true);
}, 100);
подробнее об этом ui-router reference.
Я пытался сделать страницу обновления с помощью angularjs, когда я увидел веб-сайты, которые я запутался, но код не работал для кода, тогда я получил решение для перезагрузки страницы с помощью
$state.go('path',null,{reload:true});
используйте это в функции, которая будет работать.
мне нужно было перезагрузить состояние, чтобы полосы прокрутки работали. Они не работали, когда проходили через другое государство - "регистрацию". Если приложение было принудительно закрыто после регистрации и снова открыто, то есть оно перешло непосредственно в состояние "home", полосы прокрутки работали. Ни одно из вышеперечисленных решений не сработало.
когда после регистрации, Я заменил:
$state.go("home");
С
window.location = "index.html";
приложение перезагрузилось, и полосы прокрутки работали.
контроллер вызывается только один раз, и вы должны сохранить эту логическую модель, что я обычно делаю:
Я создаю метод $scope.reload(params)
в начале этого метода я вызываю $ionicLoading.show({template:..})
чтобы показать мой пользовательский счетчик
когда процесс перезагрузки может быть завершен, я могу позвонить $ionicLoading.hide()
в качестве обратного вызова
наконец, внутри кнопки Обновить, я добавляю ng-click = "reload(params)"
единственным недостатком этого решения является то, что вы теряете ионной навигации история системы
надеюсь, что это помогает!
Если вы хотите перезагрузить после изменения вида, вам нужно
$state.reload('state',{reload:true});
Если вы хотите сделать этот вид новым "корнем", вы можете сказать ionic, что следующий вид будет root
$ionicHistory.nextViewOptions({ historyRoot: true });
$state.go('app.xxx');
return;
Если вы хотите, чтобы ваши контроллеры перезагружались после каждого изменения вида
app.config(function ($stateProvider, $urlRouterProvider, $ionicConfigProvider) {
$ionicConfigProvider.views.maxCache(0);
.состояние (url: '/ url', контроллер: Ctl, templateUrl: 'template.html', кэш: false) кэш: false ==> решил мою проблему !
Как указал @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, например:
$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 = '';
});
Я пробовал много методов, но нашел этот способ совершенно правильно:
$window.location.reload();
надеюсь, что это поможет другим застрять в течение нескольких дней, как я с версией: angular 1.5.5, ionic 1.2.4, angular-ui-router 1.0.0