Побудуйте рядок запиту з об'єкта параметрів


77

Як побудувати URL-адресу з параметрами запиту в Angularjs.

Я бачу API $ location.search ()

проблема полягає в тому, що $ location (url) полягає у перенаправленні на url. У моєму випадку я хочу передати пари url і key: value для параметрів запиту та побудувати URL-адресу. щось на зразок

url: /a/b/c params:{field1: value1, field2: value2}

результат: /a/b/c?field1=value1&field2=value2

Я люблю використовувати цю URL-адресу для посилань. Я також бачив кутове кодування ?, &символи. Чи можу я цього уникнути?

Редагувати:

Моїм наміром було використовувати url як href для якірних елементів. Я використовую $ http для надсилання запиту, але іноді мені потрібно надати посилання з параметрами запиту (на основі поточного об'єкта)

Дякую


1
Далі висвітлено проблему із загальним JS (без Angular) stackoverflow.com/questions/111529/…
v-tec

мені так важко повірити, що все ще потрібні зовнішні бібліотеки .. У JavaScript є цілий API DOM, але нічого для цього .. дивовижно! Javascript божевільний!
хлопець мограбі

Чи хотіли б ви прийняти відповідь?
Армель Ларсьє

Відповіді:


124

Є гарне рішення, починаючи з 1.4+. Ви можете побудувати рядок запиту з об’єкта параметрів за допомогою $httpParamSerializer:

var qs = $httpParamSerializer(params);

Документи дивіться тут

За замовчуванням серіалізатор $ http params, який перетворює об'єкти на рядки згідно з наступними правилами:

{'foo': 'bar'} results in foo=bar
{'foo': Date.now()} results in foo=2015-04-01T09%3A50%3A49.262Z (toISOString() and encoded representation of a Date object)
{'foo': ['bar', 'baz']} results in foo=bar&foo=baz (repeated key for each array element)
{'foo': {'bar':'baz'}} results in foo=%7B%22bar%22%3A%22baz%22%7D" (stringified and encoded representation of an object)
Note that serializer will sort the request parameters alphabetically.

настільки корисний при тестуванні за $httpBackend.expectGET()допомогою складних параметрів запиту
Гійом

14

Angular використовує buildUrl()функцію внутрішньо для створення рядка запиту з об'єкта параметрів. Наразі його неможливо використовувати у своєму коді, оскільки він приватний, $HttpProviderякщо ви не хочете зробити якусь eval()магію.

Пов’язані питання про github:


3

Повірте, ви справді начебто гавкаєте неправильне дерево ... вам потрібно поглянути на службу $ http, яка надає вам $ http.get (url, config) або $ http.post (url, data, config). Для отримання запиту GET з параметрами див. Наступний SO

Параметри отримання $ http не працюють

Інформацію про $ http та як це працює див. У документації Angular.

http://docs.angularjs.org/api/ng.$http

Можливо, я неправильно розумію ціль, і ви насправді хочете перейти до іншого місця, я пропоную тут лише зробити запит у фоновому режимі (стиль AJAX).

http://jsfiddle.net/4ZcUW/

JS

angular.module("myApp", []).controller("MyCtrl", ["$scope", "$window", function($scope, $window) {
    $scope.goPlaces = function(url, parameter) {
        $window.open("http://www."+url+"?q="+parameter);
        //$window.open("http://www."+url+"?q="+parameter, "_self");
        //$window.open("http://www."+url+"?q="+parameter, "_top");
    };
}])

HTML

<div ng-app="myApp" ng-controller="MyCtrl">
    <a href="#" ng-click="goPlaces('google.com','Shaun Husain')">Find me</a>
</div>

Це працює для вашої справи?


2
Моїм наміром було використовувати urlhref як якірні елементи. Я використовую $ http для надсилання запиту, але іноді мені потрібно надати посилання з параметрами запиту (на основі поточного об'єкта)
bsr

@bsr: Я не знаю angular, але ви впевнені, що кодування не є артефактом того, як ви бачите отриману URL-адресу як частину дерева HTML (де, наприклад, амперсанди потрібно кодувати, щоб не помилитися як початковий символ суб'єкта господарювання)?
liori

Хмм, у цьому випадку, можливо, ви хочете використовувати $ window для використання відкритої функції, що надається браузером, замість того, щоб переглядати $ location Angular, оскільки це пов’язано з маршрутизацією, а не просто навігацією (називаючи місцем, яке, на вашу думку, воно може переміщатися, але Я не настільки впевнений) docs.angularjs.org/api/ng.$window не впевнений, що буду гратись із цим у скрипці, якщо не побачу відповіді, я його опублікую.
shaunhusain

@liori ти маєш рацію. закодована URL-адреса відображається лише в тому випадку, якщо ви переходите за посиланням (якщо переспрямування здійснюється не через $ location.search (), а вручну побудований рядок href). Це також актуально. stackoverflow.com/questions/15197837/…
bsr

0

Правила форматування внутрішньої та зовнішньої URL-адрес angular дещо відрізняються.

$ Location - це засіб активації внутрішніх маршрутів у вашому власному додатку.

Якщо це зовнішнє посилання, тоді $ http - це те, що ви хочете.

Якщо це внутрішнє посилання, то перевірте, можливо, варто перевірити синтаксис хеш / вибуху.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.