Очистити сторінку історії та оновити сторінку входу / виходу за допомогою Ionic Framework


80

Я новачок у розробці мобільних додатків з Ionic. Під час входу та виходу мені потрібно перезавантажити сторінку, щоб оновити дані, однак $state.go('mainPage')повертає користувача до подання без перезавантаження - контролер за ним ніколи не викликається.

Чи є спосіб очистити історію та перезавантажити стан в іонічному?

Відповіді:


124

Ласкаво просимо до фреймворку! Насправді маршрутизація в Ionic живиться від інтерфейсу користувача . Ймовірно, вам слід перевірити це попереднє запитання SO, щоб знайти кілька різних способів досягти цього.

Якщо ви просто хочете перезавантажити стан, ви можете використовувати:

$state.go($state.current, {}, {reload: true});

Якщо ви дійсно хочете перезавантажити сторінку (як, наприклад, ви хочете перезавантажити все), ви можете використовувати:

$window.location.reload(true)

Удачі!


Я хочу об’єднати всі файли css / js, витягнуті з віддаленого сервера, у index.html. Але я волів би перезавантажувати їх, лише якщо відбулися зміни. Як мені це структурувати?
mylord

Не впевнений, що я вас розумію @mylord. Ви говорите про перезавантаження в режимі реального часу? Можливо, вас цікавить кеш-маніфест / маніфест Html5, про який говорилося тут: tmkmobile.wordpress.com/2012/03/04/html5-offline-solution Я думаю, ви можете намагатися зробити щось інше, ніж початковий намір питання.
JimTheDev

13
$ state.go ($ state.current, {}, {reload: true}); це рішення для мене не працює.
IamStalker

@IamStalker, чи можете ви надати будь-яку додаткову інформацію або, можливо, код-код / ​​скрипку / планк для прикладу?
JimTheDev

9
$state.go($state.current, {}, {reload: true});не працює if cache:true(що є типовим, якщо кеш опущено) у визначенні стану. Тестується в #ionic 1.0.0-RC2 та 1.0.0. Дивіться мою відповідь.
ABCD

25

Я виявив, що відповідь JimTheDev спрацювала лише тоді, коли було cache:falseвстановлено визначення штату . З кешованим видом ви можете це зробити, $ionicHistory.clearCache()і тоді, $state.go('app.fooDestinationView')якщо ви переходите з одного стану в той, який кешований, але потребує оновлення.

Дивіться мою відповідь тут, оскільки вона вимагає простої зміни на Ionic, і я створив запит на витяг: https://stackoverflow.com/a/30224972/756177


1
Хороший матеріал. Я насправді не використовую це в своєму іонному додатку, тому я ціную подальші дії з функціонуванням кешування. Схоже, ваш PR піде на 1.0.1. Після того, як це буде випущено, я зроблю в своєму оригінальному дописі примітку про те, що ви зараховуєте людей і спонукаєте людей поглянути.
JimTheDev

18

Правильна відповідь:

$window.location.reload(true);

1
Ця відповідь позначена як низька якість. Чи не могли б ви спробувати пояснити, чому це правильна відповідь?
Хорхе Лейтао,

1
Тому що він використовує $windowзамістьwindow
EpokK

Ви маєте рацію в тому, що якщо ви використовуєте синтаксис .location.reload, має сенс використовувати $ window. Я змінив свою відповідь вище лише для того, щоб ми були послідовними для майбутніх читачів. Синтаксис $ state.go також може бути корисним у деяких випадках.
JimTheDev

Мені допомогла лише ця відповідь, а не відмічена
Міхал

Раніше мені подобався такий підхід, але деякі люди повідомляли, що він спричинює нескінченний цикл перезавантажень на деяких пристроях (Android 4.4, Chrome).
Олег Черемісін

18

Я знайшов рішення, яке допомогло мені це зробити. Установка cache-view="false"на ion-viewтезі вирішити мою проблему.

<ion-view cache-view="false" view-title="My Title!">
  ....
</ion-view>

вимкніть перегляд кешу, зробіть значну втрату продуктивності, вам слід уникати цих опцій. натомість ви можете обробляти події ionicView. см: stackoverflow.com/questions/25192172 / ...
ezain

@ezain, не могли б ви повідомити, як це впливає на продуктивність?
Раджешвар,

@Rajeshwar, коли увімкнено систему кешування, Ionic підтримує всю DOM, що генерується видом, прихованою, і коли відбувається зміна подання, не потрібно перераховувати DOM. Якщо у вас важкий DOM і вам потрібно його генерувати під час усіх змін переходу, ви можете оцінити відставання в анімації переходу. Якщо причиною відключення кешу є лише перезавантаження контролера, використовуйте події ionicView.
ezain

@ezain, Існує так багато способів реалізації цієї функції відключення кешу. Я спробував майже всі, у мене нічого не працювало. І цей дав мені те, що мені потрібно. І я не бачу суттєвих відставань під час завантаження цієї сторінки, хоча сторінка невелика. Тож я віддав перевагу саме цьому шляху, ніж іншим.
Раджешвар,

11

Перезавантажити сторінку - не найкращий підхід.

Ви можете обробляти події зміни стану для перезавантаження даних без перезавантаження самого подання.

читайте про життєвий цикл ionicView тут:

http://blog.ionic.io/navigating-the-changes/

і обробляти подію beforeEnter для перезавантаження даних.

$scope.$on('$ionicView.beforeEnter', function(){
  // Any thing you can think of
});

Це здається найкращим підходом.
markau

зокрема, ви можете перевірити, чи стан із кеш-пам’яті, і якщо так, то зателефонуйте до деяких з ваших API, щоб оновити його:$scope.$on('$ionicView.beforeEnter', function(scopes, states) { if (states.fromCache) { ... } }
jakub.g

@ jakub.g, якщо ви не хочете кешувати вигляд, ви можете вимкнути кеш для цього конкретного перегляду, це простіше.
ezain

6

У моєму випадку мені потрібно очистити лише перегляд і перезапустити контролер. Я міг отримати свій намір за допомогою цього фрагмента:

$ionicHistory.clearCache([$state.current.name]).then(function() {
  $state.reload();
}

Кеш все ще працює, і здається, що просто перегляд очищений.

ionic --version говорить 1.7.5.


Додаток: Коли штат має параметри, ви повинні визначити їх з огляду на ідентифікацію стану. Перевірте цей pastebin: pastebin.com/2CaGYpnz
glaucomorais

Помилки в коді Правильна версія $ ionicHistory.clearCache ([$ $.current.name]). Then (function () {$ state.reload ();});
Кирило

Просто не вистачає дужок
user623396

1

Жодне із згаданих вище рішень не працювало для імені хосту, яке відрізняється від localhost!

Мені довелося додати notify: falseдо списку параметрів, до яких я переходжу $state.go, щоб уникнути виклику слухачів Angular change, перш ніж $window.location.reloadвикликати виклик. Остаточний код виглядає так:

$state.go('home', {}, {reload: true, notify: false});

>>> РЕДАКТУВАТИ - може знадобитися $ таймаут залежно від вашого браузера >>>

$timeout(function () { $window.location.reload(true); }, 100);

<<< КІНЕЦЬ РЕДАГУВАННЯ <<<

Детальніше про це на посиланнях на ui-маршрутизатор .


0

Я намагався зробити сторінку оновлення за допомогою angularjs, коли побачив веб-сайти, я заплутався, але жоден код не працював для коду, тоді я отримав рішення для перезавантаження сторінки за допомогою

$state.go('path',null,{reload:true});

використовуйте це у функції, яка буде працювати.


0

Мені потрібно було перезавантажити стан, щоб змусити смуги прокрутки працювати. Вони не працювали при проходженні через іншу державу - «реєстрацію». Якщо додаток було примусово закрито після реєстрації та відкрито знову, тобто воно перейшло безпосередньо у „домашній“ стан, смуги прокрутки працювали. Жодне з наведених вище рішень не спрацювало.

Коли після реєстрації я замінив:

$state.go("home");

з

window.location = "index.html"; 

Додаток перезавантажився, і смуги прокрутки запрацювали.


0

Контролер викликається лише один раз, і ви ПОВИННІ зберегти цю логічну модель, я зазвичай роблю це:

Я створюю метод $scope.reload(params)

На початку цього методу я телефоную, $ionicLoading.show({template:..})щоб показати свій власний блешні

Коли процес перезавантаження може закінчитися, я можу зателефонувати $ionicLoading.hide() як зворотний дзвінок

Нарешті, всередині кнопки REFRESH я додаю ng-click = "reload(params)"

Єдиним недоліком цього рішення є те, що ви втрачаєте іонну систему історії навігації

Сподіваюся, це допомагає!


0

Якщо ви хочете перезавантажити після зміни вигляду, вам потрібно

$state.reload('state',{reload:true});

Якщо ви хочете зробити цей вигляд новим "коренем", ви можете сказати ionic, що наступним видом це буде корінь

 $ionicHistory.nextViewOptions({ historyRoot: true });
 $state.go('app.xxx');
 return;

Якщо ви хочете, щоб ваші контролери перезавантажувались після кожної зміни вигляду

app.config(function ($stateProvider, $urlRouterProvider, $ionicConfigProvider) {

$ionicConfigProvider.views.maxCache(0);


0

Як зазначає контролери перезавантаження @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 = '';
});

-1

Я спробував багато методів, але виявив, що цей метод абсолютно правильний:

$window.location.reload();

Сподіваюся, це допоможе іншим затриматися на цілі дні, як я з версією: angular 1.5.5, ionic 1.2.4, angular-ui-router 1.0.0

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.