Я делаю мобильное приложение с помощью Cordova и AngularJS. В настоящее время я установил ui-router для маршрутизации, но я открыт для любой другой альтернативы для маршрутизации.
Мое желание: я хочу кэшировать определенные представления, связанные с параметрами. Другими словами, я хочу кэшировать пути (или страницы).
Пример ситуации: скажем, что мы видим страницу на панели инструментов, щелкните по обложке книги, которая перенаправляет на путь book/2
. Этот путь загружается в первый раз в приложение. Маршрутизатор перенаправляет от HomeController
до BooksController
(независимо от имени). Теперь BooksController
загружает данные для данного $stateParams
(book id = 2) и создает представление, заполненное информацией о выбранной книге.
Что я хочу в этой ситуации:
- Я возвращаюсь на страницу панели мониторинга - он уже загружен (кэширован?)
- Я снова выбираю книгу # 2
- Контроллер или маршрутизатор уведомляет, что данные об этой книге уже загружены.
- Вид не воссоздается, вместо этого он извлекается из кеша
На самом деле было бы лучше всего кэшировать все, что я посещаю, основываясь на пути. Предварительная загрузка также будет прохладной.
Причина: производительность. Когда я открываю список книг, я хочу, чтобы он показывался быстро. Когда просмотр создается каждый раз, анимация изменения страницы выглядит ужасно (она негладкая).
Любая помощь будет оценена.
EDIT:
Прежде всего, поскольку я считаю, что это распространенная проблема для многих мобильных программистов для HTML-приложений, я хотел бы уточнить некоторые данные:
- Я не ищу хаки, но ясное решение, если это возможно.
- Данные в представлениях используют AngularJS, поэтому ДА, есть такие вещи, как
ng-bind
,ng-repeat
и т.д. - Кэширование необходимо для данных и элементов DOM. Насколько я знаю, работа с макетом браузера не так дорого, как воссоздание всего дерева DOM. И перерисовать не то, что мы можем опустить.
- Наличие отдельных контроллеров - это естественная вещь. Поскольку я мог уйти без него, я не могу представить, как это все равно будет работать.
У меня есть некоторые полурешения, но я буду строго соблюдать свое желание.
Решение 1.
Поместите все представления в один файл (я могу сделать это с помощью конструктора gulp) и используйте ng-show
. Это самое простое решение, и я не верю, что кто-то, кто знает AngularJS, не подумает об этом.
A хороший трюк (от @DmitriZaitsev) - создать вспомогательную функцию для отображения/скрытия элемента на основе текущего пути местоположения.
Преимущества:
- Это легко.
- Вставка функции предварительной загрузки.
Недостатки:
- все представления должны быть в одном файле. Не спрашивайте, почему это не удобно.
- Поскольку все это касается мобильных устройств, иногда я хочу "очистить" память. Единственный способ, который я могу придумать, - удалить этих детей из DOM. Грязный, но нормально.
- Я не могу легко кэшировать/книгу/2 и /book/ 3 одновременно. Мне пришлось бы динамически создавать DOM файлы поверх некоторых шаблонов для каждого представления, связанного с параметрами.
Решение 2.
Используйте липкие состояния и будущие состояния от ui-router-extras, что является удивительным.
Преимущества:
- Разделенные виды.
- Очень простое использование, очень простое, поскольку это просто плагин для
ui-router
. - Может создавать динамические подстанции. Таким образом, можно было бы кэшировать
book1
,book2
, но я не уверен вbook/1
иbook/2
Недостатки:
- Опять же, я не уверен, но я не нашел пример с кешированием пары /tuple
(view, parameters)
. Кроме этого это выглядит круто.