22

Before I am using JQuery and I use this to send URL with parameter

window.location = myUrl + $.param({"paramName" : "ok","anotherParam":"hello"});

but with angularjS this does not work the same way

$scope.myButton = function() {
    $window.location.open = myUrl + $.param({"paramName" : "ok","anotherParam":"hello"});
};//Error: $ is not defined

can anyone help me how to do this in angularJs

13
  • what are you trying to do here? Commented Jun 17, 2014 at 3:22
  • like this, www.test.com?option=ok Commented Jun 17, 2014 at 3:27
  • 1
    add jquery if you want to use jquery functions. otherwise you need to do it the old javascript way. Commented Jun 17, 2014 at 3:41
  • 1
    angular uses jquery lite - ultimately you might want an angular directive to handle when the button is clicked Commented Jun 17, 2014 at 3:44
  • 1
    I think you want something like $location.path('xxurlxx') but i am not sure about the parameter because i am not farmiliar with what you are trying to do with the option Commented Jun 17, 2014 at 3:46

6 Answers 6

36

There's a built-in serializer in angular which mimics $.param(): $httpParamSerializerJQLike

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

2 Comments

note that $httpParamSerializer and $httpParamSerializerJQLike are available since Angular 1.4
this should be the real answer
12

If you are trying to create serialized representation of data like $.param() does,

function serializeData( data ) { 
    // If this is not an object, defer to native stringification.
    if ( ! angular.isObject( data ) ) { 
        return( ( data == null ) ? "" : data.toString() ); 
    }

    var buffer = [];

    // Serialize each key in the object.
    for ( var name in data ) { 
        if ( ! data.hasOwnProperty( name ) ) { 
            continue; 
        }

        var value = data[ name ];

        buffer.push(
            encodeURIComponent( name ) + "=" + encodeURIComponent( ( value == null ) ? "" : value )
        ); 
    }

    // Serialize the buffer and clean it up for transportation.
    var source = buffer.join( "&" ).replace( /%20/g, "+" ); 
    return( source ); 
}

and use this for your data serialization

3 Comments

how to use this function??
this function won't work if the data contains nested objects i.e: if you data is something like {foo:[{id:1, val:'test'},{id:2, val:'test2'}], bar:{test:'myTest'}} it won't work
Do not reinvent the wheel. If jQuery has this implemented, use it. Don't be too scary about mixing these libraries. AngularJS does not replace jQuery.
7

AngularJs has jquery lite on its core so you can use angular.element.param() instead of $.param()

6 Comments

this is the best answer. writing code that already exists is not a good idea.
.param() isn't included in jQLite: docs.angularjs.org/api/ng/function/angular.element
this may work if you include jQuery anyway, as angular will use that, but with pure Angular (jQuery Lite) it throws TypeError: angular.element.param is not a function
Doesn't work. Uncaught TypeError: angular.element.param is not a function(…)
I have edited this answer to avoid the misinformation of jQuery lite containing .param(). Thanks for that clarification @AlexRoss!
|
2

I found this function useful for url serialization. Will also work for nested objects.

var param = function(obj) {

  if ( ! angular.isObject( obj) ) { 
    return( ( obj== null ) ? "" : obj.toString() ); 
  }
  var query = '', name, value, fullSubName, subName, subValue, innerObj, i;

  for(name in obj) {

    value = obj[name];
    if(value instanceof Array) {
      for(i in value) {

        subValue = value[i];
        fullSubName = name + '[' + i + ']';
        innerObj = {};
        innerObj[fullSubName] = subValue;
        query += param(innerObj) + '&';
      }

    } else if(value instanceof Object) {
      for(subName in value) {

        subValue = value[subName];
        fullSubName = name + '[' + subName + ']';
        innerObj = {};
        innerObj[fullSubName] = subValue;
        query += param(innerObj) + '&';
      }
    }
    else if(value !== undefined && value !== null)
      query += encodeURIComponent(name) + '=' + encodeURIComponent(value) + '&';
  }

  return query.length ? query.substr(0, query.length - 1) : query;
};

Comments

0

You can simply use $.param on the javascript object and pass it to either $resource or $http and it should work fine. One caveat though is ensure it is an object and not an array.

var badParam = {'name':'john',...}; // contains more properties
var goodParam = {name :'john',...}; // contains more properties

Comments

0

you can inject and use this function instead: $httpParamSerializerJQLike()

Comments

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.