Я отправляю вложенный объект в качестве параметров запроса из контроллера AngularJs со следующим кодом:
$scope.redirect = function () {
const params = $httpParamSerializer({
initval: {
user: {
id: 1,
name: 'Username',
}
}
})
$location.path('/url-to-other-controller').search(params);
})
и я должен получить эту строку запроса в моем другом контроллере как объект, я пробовал несколько способов, в итоге использовал следующий код:
let qs = $location.search();
const initval = JSON.parse(qs.initval);
let userId = initval.user.id;
Я не уверен в своем методе и есть ли более чистый способ, так как мне нужно проанализировать результат первого параметра (initval).
Главный вопрос здесь, как правильно получить строку запроса, которая изначально является объектами в angularJS? и это правильный способ отправки объектов в качестве параметров запроса?
@FlorianLim Конечно, но в требованиях указано, что значения должны сохраняться даже после перезагрузки, поэтому я не могу использовать службы и даже локальное хранилище, и многие другие способы не подходят. Строгие и странные требования, поэтому мне нужен ответ на этот конкретный случай.
Понимаю. Что ж, передача сложных объектов через параметры запроса URL может вызвать проблемы, если вы не используете url-encode/decode. Простой способ обойти это — использовать кодировку base64 в строке json. Однако это увеличит размер вашей строки запроса, и в зависимости от размера ваших объектов вы можете превысить ограничения браузера еще раньше. Подробнее см. в Какова максимальная длина URL-адреса в разных браузерах?. Вопрос в том, насколько большими будут ваши объекты?
Я только что прочитал о $httpParamSerializer и узнал, что он заботится о кодировке. Однако кажется, что массивы обрабатываются таким образом, что синтаксический анализ параметров запроса становится более сложным. Если у вас нет массивов в ваших объектах и ваш текущий метод не вызывает проблем, то, боюсь, у меня нет предложений по улучшению.
@FlorianLim, спасибо за ваши усилия. Единственная альтернатива, которую я вижу, - это подключить бэкэнд, чтобы он сохранял и сохранял данные и получал их в моем другом контроллере, но, к сожалению, в моем случае это не вариант. :( Поэтому я придерживался этих требований и искал лучшие реализации.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Если вы используете JSON.parse, вам лучше использовать JSON.stringify:
$scope.redirect = function () {
const params = {
initval: JSON.stringify({
user: {
id: 1,
name: 'Username',
})
}
}
$location.path('/url-to-other-controller').search(params);
})
Затем расшифруйте:
let qs = $location.search();
const initval = JSON.parse(qs.initval);
let userId = initval.user.id;
Сервисы $httpParamSerializer и $httpParamSerializerJQLike делают необычные вещи с массивами, которые впоследствии плохо анализируются в JavaScript.
Сервисы $httpParamSerializer и $httpParamSerializerJQLike предназначены для взаимодействия с языками и фреймворками, такими как PHP и Ruby on Rails.
Вы отправляете параметры на контроллер в пределах того же SPA? Если да, то использование службы и внедрение ее в оба контроллера было бы намного лучше.