Получить сериализованный объект в качестве параметров строки запроса в angularjs

Я отправляю вложенный объект в качестве параметров запроса из контроллера 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? и это правильный способ отправки объектов в качестве параметров запроса?

Вы отправляете параметры на контроллер в пределах того же SPA? Если да, то использование службы и внедрение ее в оба контроллера было бы намного лучше.

Florian Lim 01.03.2019 22:51

@FlorianLim Конечно, но в требованиях указано, что значения должны сохраняться даже после перезагрузки, поэтому я не могу использовать службы и даже локальное хранилище, и многие другие способы не подходят. Строгие и странные требования, поэтому мне нужен ответ на этот конкретный случай.

Basel Issmail 01.03.2019 22:53

Понимаю. Что ж, передача сложных объектов через параметры запроса URL может вызвать проблемы, если вы не используете url-encode/decode. Простой способ обойти это — использовать кодировку base64 в строке json. Однако это увеличит размер вашей строки запроса, и в зависимости от размера ваших объектов вы можете превысить ограничения браузера еще раньше. Подробнее см. в Какова максимальная длина URL-адреса в разных браузерах?. Вопрос в том, насколько большими будут ваши объекты?

Florian Lim 01.03.2019 23:08

Я только что прочитал о $httpParamSerializer и узнал, что он заботится о кодировке. Однако кажется, что массивы обрабатываются таким образом, что синтаксический анализ параметров запроса становится более сложным. Если у вас нет массивов в ваших объектах и ​​ваш текущий метод не вызывает проблем, то, боюсь, у меня нет предложений по улучшению.

Florian Lim 01.03.2019 23:18

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

Basel Issmail 01.03.2019 23:24
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
5
550
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы используете 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.

Другие вопросы по теме