So this had me baffled for a bit. For using Angular’s $resource in your Angular service, you map it to a particular URL with (optional) parameters defined for that URL. Then how can you have multiple resources with their own unique URLs mapped in the same service?
For example, here’s a service called User which maps to the URL “/api/users/…”:
angular.module('myApp') .factory('User', function($resource) { return $resource('/api/users/:id/:controller', { id: '@_id' }, { changePassword: { method: 'PUT', params: { controller: 'password' } }, get: { method: 'GET', params: { id: 'me' } } }); });
As you can see, there’s one resource in this service that maps to the one URL, so then how can I add another URL for the $resource?
The answer turned out to be pretty simple, actually. What you have to do is create an object (JSON) of $resources that are returned for the service. You can have individual elements inside the object that each map to a different $resource. So, for example:
'use strict'; angular.module('myApp') .factory('User', function ($resource) { return { WithId: $resource( '/api/users/:id/:controller', { id: '@_id' }, { changePassword: { method: 'PUT', params: { controller: 'password' } }, } ), Misc: $resource( '/api/users/misc/:controller', null, { generateResetPasswordToken: { method: 'POST', params: { controller: 'generateResetPasswordToken' } }, } ), }; });
In the above example, in the “User” service, we have two resources that can be accessed. To access “changePassword”, we can use User.WithId.changePassword (which maps to a particular URL), and to access “generateResetPasswordToken” we use User.Misc.generateResetPasswordToken (which maps to another URL).
Voila!