Wie generiere ich URL-codierte Ankerlinks mit AngularJS?


75
<a href="#/search?query={{address}}" ng-repeat="address in addresses">
  {{address}}
</a>

generiert Links, die nicht URL-codiert sind, wenn ich das richtig verstehe. Was ist der richtige Weg, um zu codieren #/search?query={{address}}?

Beispieladresse ist 1260 6th Ave, New York, NY.

Antworten:


109

Sie können das native encodeURIComponentin Javascript verwenden. Sie können es auch zu einem Zeichenfolgenfilter machen, um es zu verwenden.

Hier ist das Beispiel für die Herstellung eines escapeFilters.

js:

var app = angular.module('app', []);
app.filter('escape', function() {
  return window.encodeURIComponent;
});

html:

<a ng-href="#/search?query={{address | escape}}">

(aktualisiert: Anpassung an Karlies 'Antwort, die ng-hrefstatt einfach verwendet wird href)


4
Es scheint Probleme mit Escape, encodeURI und encodeURIComponent zu geben ( stackoverflow.com/a/12796866/377920 ). Ich frage mich, ob Angular eine integrierte Codierungsfunktion hat, die wir stattdessen nutzen können. Ansonsten gute Antwort.
— Randomguy

2
Dies wird zurückgegeben, #/search?query=undefinedwenn addresses nicht definiert ist. Wenn dies nicht der Fall ist, finden Sie unten eine modifizierte Lösung unter stackoverflow.com/a/31559624/179014 .
— Asmaier

@Tosh: Gibt es keine Möglichkeit, es auf $locationProviderEbene zu konfigurieren ?
— Shashank Vivek

22

Die Lösung von @ Tosh wird zurückgegeben, #/search?query=undefinedwenn sie nicht addressdefiniert ist

<a ng-href="#/search?query={{address | escape}}">

Wenn Sie stattdessen eine leere Zeichenfolge für Ihre Abfrage erhalten möchten, müssen Sie die Lösung auf erweitern

var app = angular.module('app', []);
app.filter('escape', function() {
    return function(input) {
        if(input) {
            return window.encodeURIComponent(input); 
        }
        return "";
    }
});

Dies wird zurückgegeben, #/search?query=wenn addresses nicht definiert ist.


1
Wenn die Eingabe 0 ist, wird sie durch "" ersetzt
— JeremyWeir

Wenn Sie nur eine leere Zeichenfolge zurückgeben möchten, undefinedverwenden Sie diese -app.filter('escape', () => (input) => input !== undefined ? window.encodeURIComponent(input) : '');
— doublesharp

15

Sie können den encodeUri-Filter verwenden: https://github.com/rubenv/angular-encode-uri

  1. Fügen Sie Ihrem Projekt angle-encode-uri hinzu:

    bower install --save angular-encode-uri

  2. Fügen Sie es Ihrer HTML-Datei hinzu:

    <script src="bower_components/angular-encode-uri/dist/angular-encode-uri.min.js"></script>

  3. Verweisen Sie darauf als Abhängigkeit für Ihr App-Modul:

    angular.module('myApp', ['rt.encodeuri']);

  4. Verwenden Sie es in Ihren Ansichten:

    <a href="#/search?query={{address|encodeUri}}">


2
Ich habe dies auf die ursprüngliche Antwort zurückgesetzt. Es war vollkommen in Ordnung und jemand hat es bearbeitet, um die Absicht vollständig zu ändern.
— David Pfeffer

1
Warum ein ganzes Laubenmodul importieren, wenn es drei Zeilen lang ist? Eine völlig unnötige Abhängigkeit ...
— Toxaq

12

Toshs Antwort hat die Filteridee genau richtig. Ich empfehle es einfach so zu machen. Wenn Sie dies tun, sollten Sie jedoch "ng-href" anstelle von "href" verwenden , da das Befolgen von "href" vor dem Auflösen der Bindung zu einem fehlerhaften Link führen kann.

Filter:

'use strict';

angular.module('myapp.filters.urlEncode', [])

/*
 * Filter for encoding strings for use in URL query strings
 */
.filter('urlEncode', [function() {
  return window.encodeURIComponent;
}]);

Aussicht:

<a ng-href="#/search?query={{ address | urlEncode }}" ng-repeat="address in addresses">
  {{address}}
</a>

6

Dies ist ein funktionierendes Codebeispiel:

app.filter('urlencode', function() {
  return function(input) {
    return window.encodeURIComponent(input);
  }
});

Und in der Vorlage:

<img ng-src="/image.php?url={{item.img_url|urlencode}}"

Dies ist ein Duplikat der akzeptierten Antwort mit dem unnötigen Hinzufügen einer zusätzlichen anonymen Funktion.
— Toxaq
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.