2013-01-24 3 views
62
<a href="#/search?query={{address}}" ng-repeat="address in addresses"> 
    {{address}} 
</a> 

erzeugt Links, die nicht URL-codiert sind, wenn ich richtig verstehe. Was ist der richtige Weg, #/search?query={{address}} zu kodieren?Wie URL-codierte Anker-Links mit AngularJS generieren?

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

Antwort

96

Sie können die native in Javascript verwenden. Sie können es auch zu einem String-Filter machen, um es zu nutzen.

Hier ist das Beispiel der Herstellung escape Filter.

js:

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

html:

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

(aktualisiert: bis Karlies' Antwort Anpassung der ng-href anstelle von einfachen href verwendet)

+4

Es scheint Probleme mit escape, encodeURI und encodeURIComponent (http://stackoverflow.com/a/12796866/377920) zu geben. Ich frage mich, ob Angular eine eingebaute Codierfunktion hat, die wir stattdessen nutzen können. Gute Antwort anders. – randomguy

+0

wow. makellos! danke @ tosh-shimayama –

+22

Verwenden Sie stattdessen encodeURIComponent. –

14

Sie die encodeURI Filter verwenden: https://github.com/rubenv/angular-encode-uri

  1. hinzufügen Winkel encodieren-uri zu einem Projekt:

    bower install --save angular-encode-uri

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

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

  3. Referenz es als eine Abhängigkeit für Ihre App-Modul:

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

  4. es in Ihren Ansichten verwenden:

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

+2

Ich habe das auf die ursprüngliche Antwort zurückversetzt. Es war völlig in Ordnung und jemand hat es bearbeitet, um die Absicht komplett zu ändern. –

+0

Warum sollten Sie ein ganzes Bower-Modul importieren, wenn es drei Zeilen lang ist? Eine völlig unnötige Abhängigkeit ... – toxaq

10

Toshs Antwort hat die Filter Idee genau richtig. Ich empfehle es einfach so. Wenn Sie dies tun, sollten Sie jedoch "ng-href" statt "href" verwenden, da das Folgen der "href" vor der Bindung zu einer schlechten Verbindung 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; 
}]); 

Ansicht:

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

dies ein Arbeitscodebeispiel ist:

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}}" 
+0

Dies ist ein Duplikat der angenommenen Antwort mit dem unnötigen Hinzufügen einer zusätzlichen anonymen Funktion. – toxaq

19

@ Lösung Toshs kehrt #/search?query=undefined wenn address undefiniert in

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

Wenn Sie es vorziehen, eine leere Zeichenfolge stattdessen für Ihre Abfrage erhalten Sie die Lösung für

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

Diese zurückkehren #/search?query= zu verlängern haben wenn address nicht definiert ist.

Verwandte Themen