Xây dựng chuỗi truy vấn từ đối tượng tham số


77

Cách tạo url với các tham số truy vấn trong Angularjs.

Tôi thấy API $ location.search ()

vấn đề là $ location (url) là chuyển hướng đến url. Trong trường hợp của tôi, tôi muốn chuyển cặp url và key: value cho các tham số truy vấn và xây dựng url. cái gì đó như

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

kết quả: /a/b/c?field1=value1&field2=value2

Tôi thích sử dụng url này cho các liên kết. Tôi cũng đã thấy mã hóa góc cạnh ?, &ký tự. Tôi có thể tránh điều này không?

Biên tập:

Ý định của tôi là sử dụng url làm href cho các phần tử neo. Tôi sử dụng $ http để gửi yêu cầu, nhưng đôi khi tôi cần cung cấp một liên kết, với các tham số truy vấn (dựa trên đối tượng hiện tại)

Cảm ơn


1
Sau đây đề cập đến vấn đề với JS chung (không có Angular) stackoverflow.com/questions/111529/…
v-tec

Thật khó để tôi tin rằng các thư viện bên ngoài vẫn được yêu cầu .. Có toàn bộ API DOM trong JavaScript, nhưng không có gì cho điều này .. tuyệt vời! Javascript thật điên rồ!
chàng trai mograbi

Bạn có quan tâm để chấp nhận một câu trả lời?
Armel Larcier

Câu trả lời:


124

Có một giải pháp tuyệt vời kể từ 1.4+. Bạn có thể tạo một chuỗi truy vấn từ một đối tượng tham số với $httpParamSerializer:

var qs = $httpParamSerializer(params);

Xem tài liệu tại đây

Bộ tuần tự $ http params mặc định chuyển đổi các đối tượng thành chuỗi theo các quy tắc sau:

{'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.

rất hữu ích khi thử nghiệm với $httpBackend.expectGET()các tham số truy vấn phức tạp
Guillaume


3

Hãy tin rằng bạn thực sự đang chọn sai cây ... bạn cần xem xét dịch vụ $ http cung cấp cho bạn $ http.get (url, config) hoặc $ http.post (url, data, config). Đối với một yêu cầu GET với các tham số, hãy xem SO sau đây

$ http get tham số không hoạt động

Để biết thông tin về $ http và cách nó hoạt động, hãy xem tài liệu Angular.

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

Có lẽ tôi đang hiểu sai mục tiêu và bạn thực sự muốn điều hướng đến một nơi khác, những gì tôi đề xuất ở đây chỉ là thực hiện yêu cầu trong nền (kiểu 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>

Điều này có làm việc cho trường hợp của bạn?


2
Ý định của tôi là sử dụng urlas href cho các phần tử neo. Tôi sử dụng $ http để gửi yêu cầu, nhưng đôi khi tôi cần phải cung cấp một liên kết, với params truy vấn (dựa trên đối tượng hiện hành)
BSR

@bsr: Tôi không biết góc cạnh, nhưng bạn có chắc rằng mã hóa không phải là một cấu phần của cách bạn xem URL kết quả như một phần của cây HTML (ví dụ: ký hiệu và cần được mã hóa để tránh bị nhầm lẫn là ký tự đầu tiên của một thực thể)?
liori

Rất tiếc, trong trường hợp đó, có lẽ bạn muốn sử dụng $ window để sử dụng chức năng mở do trình duyệt cung cấp thay vì đi qua vị trí $ của Angular vì điều đó liên quan đến định tuyến thay vì chỉ điều hướng (được đặt tên là vị trí bạn nghĩ nó có thể điều hướng nhưng Tôi không chắc lắm) docs.angularjs.org/api/ng.$window Tôi không chắc tôi sẽ đùa giỡn với cái này nếu tôi không thấy câu trả lời. Tôi sẽ đăng nó.
shaunhusain

@liori bạn nói đúng. url được mã hóa chỉ hiển thị nếu bạn theo liên kết (nếu chuyển hướng không phải qua $ location.search () mà là một chuỗi href được xây dựng theo cách thủ công). Điều này cũng có liên quan. stackoverflow.com/questions/15197837/…
bsr

0

Quy tắc định dạng URL bên trong và bên ngoài của angle hơi khác nhau.

Vị trí $ là một phương tiện kích hoạt các tuyến nội bộ trong ứng dụng của riêng bạn.

Nếu đó là một liên kết bên ngoài thì $ http là những gì bạn muốn.

Nếu đó là một liên kết nội bộ, thì hãy kiểm tra nó có thể đáng để kiểm tra cú pháp hash / bang.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.