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

generates links that are not url encoded if I understand correctly. What is the proper way to encode #/search?query={{address}}?

Example address is 1260 6th Ave, New York, NY.

5 Answers 5

111

You can use the native encodeURIComponent in javascript. Also, you can make it into a string filter to utilize it.

Here is the example of making escape filter.

js:

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

html:

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

(updated: adapting to Karlies' answer which uses ng-href instead of plain href)

Sign up to request clarification or add additional context in comments.

3 Comments

There seems to be problems with escape, encodeURI and encodeURIComponent (stackoverflow.com/a/12796866/377920). I wonder if Angular has some built-in encoding function we can leverage instead. Good answer otherwise.
This will return #/search?query=undefined if address is undefined. If that is not what you want see a modified solution below at stackoverflow.com/a/31559624/179014 .
@Tosh: isnt there any way to configure it at $locationProvider level ?
24

@Tosh's solution will return #/search?query=undefined if address is undefined in

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

If you prefer to get an empty string instead for your query you have to extend the solution to

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

This will return #/search?query= if address is undefined.

2 Comments

If input is 0, this will replace it with ""
If you want to only return an empty string for undefined use this - app.filter('escape', () => (input) => input !== undefined ? window.encodeURIComponent(input) : '');
15

You could use the encodeUri filter: https://github.com/rubenv/angular-encode-uri

  1. Add angular-encode-uri to your project:

    bower install --save angular-encode-uri

  2. Add it to your HTML file:

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

  3. Reference it as a dependency for your app module:

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

  4. Use it in your views:

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

2 Comments

I reverted this back to the original answer. It was perfectly fine and someone edited it to completely change the intent.
Why go to the lengths of importing an entire bower module when it is three lines long? A completely unnecessary dependency...
13

Tosh's answer has the filter idea exactly right. I recommend do it just like that. However, if you do this, you should use "ng-href" rather than "href", since following the "href" before the binding resolves can result in a bad link.

filter:

'use strict';

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

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

view:

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

Comments

7

this is a working code example:

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

And in the template:

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

1 Comment

This is a duplicate of the accepted answer with the unnecessary addition of an extra anonymous function.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.