Подтвердить что ты не робот

Возможно ли очистить кеш просмотра в Ionic?

В настоящее время я работаю над проектом Angular/Ionic/Cordova, и мы недавно обновили его до последней версии Ionic. Из версии, которую ранее использовал проект, в нее был введен кеш просмотра. Тем не менее он также ввел проблему.

Приложение ориентировано на клиента и очень ориентировано на данные. Пользователь должен аутентифицироваться для просмотра данных, связанных с их учетной записью, в настоящее время; когда пользователь выходит из системы и регистрируется в другой учетной записи, так как все точки кэширования видны, они представлены в виде просмотров последней учетной записи.

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

Настройка cache-view="false" не является опцией, так как полностью отключит кеш.

Я также попытался установить $ionicConfig.views.maxCache(0);, а затем вернуться к умолчанию по умолчанию 10 в надежде, что он будет чистить кеш при этом, но это не повлияло.

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

Есть ли способ просто очистить кеш просмотра?

4b9b3361

Ответ 1

В определении состояния в app.js вы можете добавить cache:false, чтобы отключить кеширование (см. Отключить кеш в государственном провайдере в документах Ionic. Или вы можете сохраняйте кеширование, кроме случаев, когда вы знаете, что данные изменились.

  • Если вы уже на странице, вы можете сделать, $state.go($state.currentState, {}, {reload:true})
  • Если вы находитесь в другом состоянии и хотите вернуться к состоянию, которое обычно кэшируется, но вы хотите его обновить, вы можете сделать, $ionicHistory.clearCache().then(function(){ $state.go('app.fooState') })

Обратите внимание: последний требует, чтобы clearCache возвращал обещание. См. Изменения, внесенные в этот запрос на растяжение, и сравните реализацию clearCache, который у вас есть сейчас: https://github.com/driftyco/ionic/pull/3724

Ответ 2

Я наткнулся на аналогичный сценарий, где вход в систему с другим пользователем показывал мне устаревшее/кэшированное представление. Вы можете сделать cache: false на уровне определения состояния, но это полностью отключает кеш для этого состояния в вашем приложении.

Что вы можете сделать, это очистить все кешированные представления и историю, когда пользователь вводит состояние входа/входа в ваше приложение (как вы сказали). Кажется идеальным.

// code inside your signin controller

$scope.$on("$ionicView.enter", function () {
   $ionicHistory.clearCache();
   $ionicHistory.clearHistory();
});

Ответ 3

Вы также можете сделать это, установив cache:false в $stateProvider:

$stateProvider.state('myState', {
   cache: false,
   url : '/myUrl',
   templateUrl : 'my-template.html'
})

Ответ 4

Вы ищете что-то вроде этого?

$ionicHistory.clearCache();

EDIT:

В Ionic github есть проблема: Issue

Ответ 5

Хорошо, это старая проблема, я объясню, что на самом деле происходит и как ее решить:

P.S: Если вы хотите перейти прямо к РЕШЕНИЮ, просто прокрутите вниз.

Код $ionicHistory.clearCache():

 `clearCache: function(stateIds) { return $timeout(function() { 
     $ionicNavViewDelegate._instances.forEach(function(instance) { 
         instance.clearCache(stateIds); 
     }); 
 }`

Итак, как вы можете видеть, требуется 1 параметр cllaed stateIds, который является массивом stateId. Действительно, я изо всех сил пытался выяснить, что stateId является не более чем stateName.

Итак, отпустите глубже. Код $ionicNavView.clearCache, который используется в строке выше "instance.clearCache(stateIds)":

self.clearCache = function(stateIds) {
var viewElements = $element.children();
var viewElement, viewScope, x, l, y, eleIdentifier;

for (x = 0, l = viewElements.length; x < l; x++) {
  viewElement = viewElements.eq(x);

  if (stateIds) {
    eleIdentifier = viewElement.data(DATA_ELE_IDENTIFIER);

    for (y = 0; y < stateIds.length; y++) {
      if (eleIdentifier === stateIds[y]) {
        $ionicViewSwitcher.destroyViewEle(viewElement);
      }
    }
    continue;
  }

  if (navViewAttr(viewElement) == VIEW_STATUS_CACHED) {
    $ionicViewSwitcher.destroyViewEle(viewElement);

  } else if (navViewAttr(viewElement) == VIEW_STATUS_ACTIVE) {
    viewScope = viewElement.scope();
    viewScope && viewScope.$broadcast('$ionicView.clearCache');
  }

}
};

И, как вы можете видеть в коде, этот clearCache НЕ ПРОПУСТИТ ВСЕ КАТЕШКИ, вместо этого он уничтожает все кэшированные представления, которые соответствуют значению в массиве stateIds. Если нет никакого параметра, ТОЛЬКО ПРОЙДЕТ ФАКТИЧЕСКИЙ ВЗГЛЯД.

Таким образом, решение для этого, используя только Ионный способ, заключается в вызове $ionicHistory.clearCache() со всеми вашими именами состояний в массиве в качестве параметра.

Например: РЕШЕНИЕ $ ionicHistory.clearCache(['login', 'map', 'home']); Я не могу поверить, что какой-либо разработчик Ionic не врывался в код раньше или пропустил эту простую дату. Там много людей, которые болеют за это.

Просто, чтобы сделать его кристально чистым, я хочу указать, где находится сама ошибка (если мы можем назвать ее ошибкой), возможно, она будет удобна для разработчиков:

self.clearCache = function (stateIds) {

[...]

 var viewElements = $element.children();

} То, что делает вся функция в основном:

Получить все элементы с помощью JQLite Цикл элементов Убедитесь, что элемент равен единице в массиве StateIds и уничтожает его; перейдите к следующему элементу. Проверьте, сохранен ли элемент в цикле или активен, и в обоих случаях уничтожить его Я не буду углубляться в это, но отлаживая его, я мог видеть, что элементы получены из var viewElements = $element.children(); не является массивом всех ваших представлений, даже кэшированных, намеренно или нет, он не пропускает все ваши состояния, чтобы очистить все те, которые соответствуют "ACTIVE" или "CACHED". Если вы хотите, чтобы он переместил все ваши состояния и уничтожил все кэшированные представления и данные, которые вам нужно выполнить, передайте параметр stateIds array.

Кроме того, существует еще одно странное поведение, потому что, когда я отлаживал его, я видел, когда массив var viewElements был заполнен двумя элементами, и эти два элемента были из одного и того же состояния, один разрешил "CACHED" другой распознаватель, ACTIVE ', даже если разрешить 2 типа, используемые в условиях if, кеш не был очищен вообще.

Я лично считаю, что это неверно реализовано или широко используется неправильно. Дело в том, что там много людей раскалывают головы, и разработчики даже не дают этого простого объяснения.