4

In AngularJS, I'm trying to pass a parameter in a controller call to a service factory. However, I can't seem to get the parameter passed. The function always passes what I set to be the default in the service. And if I don't include the default, it doesn't pass anything.

For example, my code looks similar to:

Controller

...
Room.enter({room_id: '5'/*$scope.room_id*/}, function(return_data)
    {
        //Callback function stuff.
        ...
    }
...

Services

...
services.factory('Room', ['$resource',
    function($resource)
        {
            return $resource('/room/:room_id', {}, {
                    enter: {method: 'PUT', params:{room_id:'-1'}}
        });
    }
]);
...

This way the http resource "/room/-1" is called even though I am trying to pass 5.

If I remove the params part of the "enter" method, then "/room" is all that is called. No params are passed at all.

Any suggestions as to what I'm doing wrong? Thank you much!

golmschenk
  • 11,736
  • 20
  • 78
  • 137

1 Answers1

9

Try

services.factory('Room', ['$resource',
    function($resource)
        {
            return $resource('/room/:room_id', {}, {
                enter: {method: 'PUT', params:{room_id:'@room_id'}}
        });
    }
]);

Edit:

Your parameters are passed as an object. Therefore, '@room_id' means that the value of the room_id property of the object passed should be extracted.

Note that the names must not match. In your controller, you could as well say

Room.enter({id: '5'}...

and get the value of the parameter in your service as

..., params:{room_id:'@id'}

kubuntu
  • 2,525
  • 1
  • 22
  • 24
  • That works. Mind explaining why? Looking at the AngularJS tutorial they don't specify any parameter like that when passing a parameter to the get function of the resource. So why is this different? – golmschenk Feb 20 '14 at 16:02
  • I edited answer to add an explanation. I hope it helps. Cheers – kubuntu Feb 20 '14 at 16:14