Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 09.07.2016, 09:57
Аватар для armidoll
Кандидат Javascript-наук
Отправить личное сообщение для armidoll Посмотреть профиль Найти все сообщения от armidoll
 
Регистрация: 28.05.2015
Сообщений: 116

Управление состоянием: URL + json 'stringify' / 'parse'
Доброго времени суток!

1. Есть spa/модуль/страница/что_угодно
2. Состоянием управляем через URL, например:
site.com/page#section01&&state={param01:0001, ... , paramN:1000}

3. Всё, что после 'state=' результат, например:
encodeURIComponent( JSON.stringify( stateMap ) )

( где stateMap обычный объект - карта состояния ).
Восстановление состояния происходит с использованием в т.ч. JSON.parse( stateStr ) ( где stateStr - часть URL после 'state=' из п.2)

1. Какие могут быть недостатки у такого подхода?
2. Есть ли подход, который считается лучше? Почему?
Ответить с цитированием
  #2 (permalink)  
Старый 09.07.2016, 13:15
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

1. Не работает в Opera Mini
2. Не стоит хранить в URI личные данные.
Если туда впихнуть в JSON объект, ссылка может получиться длинной.
В таком случае можно исползват массив с только значениями объекта.

Например есть объект:

Код:
  {
    "page": "planner",
    "start": "@20",
    "end": "@35",
    "lang": "ru"
  }
ОБЪЕКТ
У вас получится
#state={"page":"planner","start":"@20","end":"@35","lang":"ru"}


МАССИВ
Но можно решить что у вас ключи идут в таком порядке: "page" "start" "end" "lang"
Тогда получится (исползуя в качестве разделителей "/")
#state=planner/@20/@35/ru


В hash можно запихнуть только массив
#planner/@20/@35/ru




У вас было
site.com/page#section01&&state={param01:0001, ... , paramN:1000}


Можно переделать например в
site.com/page#section01/0001/ ... /1000



P. S. Я сам часто использую такой подход (используя событие hashchange или history.pushState/history.replaceState), поскольку именно нравится то, что
1) работает навигация
2) возможно добавить ссылку в закладки или скопировать и отправить кому-то и увидят тоже самое
3) если ссылки на странице сформулированы в виде <a href="#something">(в случае със hashchange) то при переходе по ней не происходит перезагрузки
Ответить с цитированием
  #3 (permalink)  
Старый 09.07.2016, 14:03
Аватар для armidoll
Кандидат Javascript-наук
Отправить личное сообщение для armidoll Посмотреть профиль Найти все сообщения от armidoll
 
Регистрация: 28.05.2015
Сообщений: 116

Спасибо за мнение.

Дополняю:
Хотелось бы, чтобы набор ключей - параметров и их порядок в карте состояния могли быть произвольными. Есть, к примеру, дефолтные состояние параметров, которые не сохраняются, а пишутся только в случае их изменения ( мне показалось, это какая-никакая экономия )

Есть пример:
http://www.gwd.ru/projects/

Мне показалось в этом случае излишним добавлять в URI 'area' и 'cost', даже тогда, когда они не меняются. Возможно, чего-то не понимаю.

Ссылка действительно нередко получается длинной, я кроме как пользоваться сторонним сервисом сокращения ссылок пока не нашел решения ( не нравится, что становимся зависимым от него ).
Ответить с цитированием
  #4 (permalink)  
Старый 09.07.2016, 14:45
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

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

Например
#product/17/
после парсинга ["product", "17"]
17-ый продукт

#search/115,300/6000,15000/
после парсинга например ["search", [115, 300], [6000, 15000]]
ищем стоимость 115...300 площадь 6000...15000

И соответственно в зависимости от первого значения знаем как разбирать остальные данные

Например в реальных проектах такой подход используетя

1. Google переводчик
https://translate.google.ee/?hl=bg&t...n/ru/my%20word
обратите внимание когда печатаете состояние сразу меняетя и в URI

2.Google mail
https://mail.google.com/mail/u/0/?ta...5083682d92e3b0
https://mail.google.com/mail/u/0/?ta...58ce1e9ff5c684
обратите внимание у них первый показывает какая папка и так далее

3. Расписания общественного транспорта г. Таллинна
Здесь таким образом зависит, какой вид показывать:
- если расписание, то какой вид транспорта, направление, показывать ли карту,
- если поиск маршрута, то начальная и конечная остановка
- и т.д и т.д

https://transport.tallinn.ee/#bus/2/a-b/13604-1/map/ru
https://transport.tallinn.ee/#plan/2...4-1,13705-1/ru

И заметьте ссылки не такие и длинные в общем получаются...

Последний раз редактировалось Malleys, 06.03.2019 в 20:42. Причина: Поменял http://soiduplaan.tallinn.ee на https://transport.tallinn.ee/
Ответить с цитированием
  #5 (permalink)  
Старый 09.07.2016, 15:21
Аватар для armidoll
Кандидат Javascript-наук
Отправить личное сообщение для armidoll Посмотреть профиль Найти все сообщения от armidoll
 
Регистрация: 28.05.2015
Сообщений: 116

Ок. Спасибо, сподвигли на мысль кодировать/декодировать части карты состояния.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
nodejs json parse large json object kames AJAX и COMET 4 10.08.2016 02:52
Метод для конвертирования едениц px, em, %, pt. jegit Элементы интерфейса 0 07.03.2013 16:15
ajax json parse error xber9 jQuery 3 27.11.2012 00:15
Водяной знак на fancybox bobrina Общие вопросы Javascript 1 03.06.2011 21:11
Преобразование URL в JSON mikeles Events/DOM/Window 1 06.03.2011 12:38