URL в одностраничном приложении backbone.js становится слишком длинным (~98 000 символов)

У меня есть одностраничное приложение JavaScript (использующее backbone.js), где состояние приложения хранится как часть параметров URL. На этой веб-странице много флажков.

Итак, если пользователь нажимает URL-адрес, например http://my-app.org/project/#app/load?checkboxID[4053]=1&checkboxID[4054]=1&checkboxID[4055]=1&checkboxID[4056]=1&checkboxID[4057]=1&checkboxID[4058]=1&checkboxID[4059]=1...goes on and on, various further params...

затем страница настраивается (используя Backbone.Router) с установленными флажками. Обратите внимание на решетку #app в URL-адресе, означающую, что параметры обрабатываются приложением JavaScript.

Проблема в том, что теперь у приложения гораздо больше параметров, чем я думал раньше. Следовательно, со всеми включенными флажками я получаю URL-адрес длиной около 98 000 символов, тогда как, согласно этому ответу, он может только максимум 2000. Упс :-(

Что вы посоветуете, чтобы справиться с этим? Я подумал, может быть, есть умный способ «укоротить»/«сжать» строку URL-адреса в JavaScript (например, gzip + base64, кодирующий строку URL-адреса), но даже это не укорачивает URL-адрес настолько, чтобы он был меньше 2000 символов.


person nachtigall    schedule 22.03.2013    source источник
comment
Не могли бы вы объяснить цель отражения состояния приложения в URL-адресе? Это поможет определить идеальное решение.   -  person Matt Stone    schedule 22.03.2013
comment
Вы можете использовать историю браузера в одностраничном приложении, в моем случае с помощью Backbone.Router. То есть пользователь может использовать кнопки «Назад/Вперед» браузера. Пользователи могут даже отправить ссылку по электронной почте, и (поскольку URL-адрес хранит состояние приложения) она откроется с теми же настройками/конфигурацией.   -  person nachtigall    schedule 24.03.2013


Ответы (2)


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

var myApp = myApp || {};
myApp.state = myApp.state || {};

И когда вы используете URL для переноса состояния, просто заполните этот объект и используйте его повсюду.

PS: этот ответ может вам не понравиться, поскольку вы ищете сжатие, подобное вещам, и не хотели бы слишком сильно менять свой код. Еще предложение для вас.

person sachinjain024    schedule 22.03.2013

Не могли бы вы перенастроить URL-адрес для чтения параметров в виде массива вместо отдельных элементов, например.

checkboxId=[4053, 4054, 4054 ...]

Это сэкономит некоторые символы, и вы можете просто просмотреть идентификаторы в указанном массиве.

Если «40» является общим символом или если «4» является общим, вы можете даже удалить это из значения и добавить его перед запуском скрипта?

person joe_peachy    schedule 22.03.2013