Erstellen Sie eine Abfragezeichenfolge aus dem Parameterobjekt

76

So erstellen Sie eine URL mit Abfrageparametern in Angularjs.

Ich sehe die API $ location.search ()

Das Problem ist, dass $ location (url) zur URL umleitet. In meinem Fall möchte ich ein URL- und ein Schlüssel-Wert-Paar für die Abfrageparameter übergeben und die URL erstellen. etwas wie

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

Ergebnis: /a/b/c?field1=value1&field2=value2

Ich benutze diese URL gerne für Links. Ich habe auch Winkelcodierung gesehen ?, &Zeichen. Kann ich das vermeiden?

Bearbeiten:

Meine Absicht war es, die URL als href für Ankerelemente zu verwenden. Ich verwende $ http, um die Anfrage zu senden, aber manchmal muss ich einen Link mit Abfrageparametern (basierend auf dem aktuellen Objekt) bereitstellen.

Vielen Dank

bsr
quelle
1
Das Folgende behandelt das Problem mit allgemeinen JS (kein Winkel) stackoverflow.com/questions/111529/…
v-tec
Es fällt mir so schwer zu glauben, dass noch externe Bibliotheken erforderlich sind. Es gibt eine ganze DOM-API in JavaScript, aber nichts dafür. Erstaunlich! Javascript ist verrückt!
Kerl Mograbi
Möchten Sie eine Antwort akzeptieren?
Armel Larcier

Antworten:

124

Ab 1.4+ gibt es eine schöne Lösung. Sie können eine Abfragezeichenfolge aus einem Parameterobjekt erstellen mit $httpParamSerializer:

var qs = $httpParamSerializer(params);

Siehe Dokumente hier

Standard $ http params serializer, der Objekte nach den folgenden Regeln in Zeichenfolgen konvertiert:

{'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.
Armel Larcier
quelle
so nützlich beim Testen mit $httpBackend.expectGET()mit komplizierten Abfrageparametern
Guillaume
3

Glauben Sie, dass Sie wirklich den falschen Baum bellen ... Sie müssen sich den $ http-Dienst ansehen, der Ihnen $ http.get (URL, Konfiguration) oder $ http.post (URL, Daten, Konfiguration) gibt. Eine GET-Anforderung mit Parametern finden Sie in der folgenden SO

$ http get-Parameter funktionieren nicht

Informationen zu $ ​​http und seiner Funktionsweise finden Sie in den Angular-Dokumenten.

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

Vielleicht verstehe ich das Ziel jedoch falsch und Sie möchten tatsächlich zu einem anderen Ort navigieren. Ich schlage hier vor, die Anfrage nur im Hintergrund zu stellen (AJAX-Stil).

http://jsfiddle.net/4ZcUW/

Die 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");
    };
}])

Der HTML

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

Funktioniert das für Ihren Fall?

Shaunhusain
quelle
2
Meine Absicht war es, das urlals href für Ankerelemente zu verwenden. Ich benutze $ http, um die Anfrage zu senden, aber manchmal muss ich einen Link mit Abfrageparametern (basierend auf dem aktuellen Objekt) bereitstellen
bsr
@bsr: Ich kenne Angular nicht, aber sind Sie sicher, dass die Codierung kein Artefakt der Art und Weise ist, wie Sie die resultierende URL als Teil des HTML-Baums sehen (wobei z. B. kaufmännisches Und codiert werden muss, um nicht als Anfangszeichen verwechselt zu werden? eines Unternehmens)?
Liori
Hmm, in diesem Fall möchten Sie vielleicht $ window verwenden, um die vom Browser bereitgestellte Öffnungsfunktion zu verwenden, anstatt Angulars $ -Standort zu durchlaufen, da dies eher mit Routing als nur mit Navigation zu tun hat (als Standort, von dem Sie denken, dass er navigieren könnte, aber Ich bin mir nicht so sicher) docs.angularjs.org/api/ng.$window Ich bin mir nicht sicher, ob ich damit in einer Geige spielen werde, wenn ich keine Antwort sehe, werde ich es posten.
Shaunhusain
@liori du hast recht. Die codierte URL wird nur angezeigt, wenn Sie dem Link folgen (wenn die Umleitung nicht über $ location.search () erfolgt, sondern über eine manuell erstellte href-Zeichenfolge). Dies ist auch relevant. stackoverflow.com/questions/15197837/…
bsr
0

Die internen und externen URL-Formatierungsregeln von angle unterscheiden sich geringfügig.

Der $ -Standort ist ein Mittel zum Aktivieren interner Routen in Ihrer eigenen Anwendung.

Wenn es sich um einen externen Link handelt, ist $ http das, was Sie wollen.

Wenn es sich um einen internen Link handelt, überprüfen Sie, ob es sich lohnt, die Hash / Bang-Syntax zu überprüfen.

Chris Reynolds
quelle