Merci à Andy Joslin. J'ai repris son idée d'emballage de la ressource actions. Le service de la ressource ressemble à ceci maintenant:
.factory('Todo', ['$resource', 'TokenHandler', function($resource, tokenHandler) {
var resource = $resource('http://localhost:port/todos/:id', {
port:":3001",
id:'@id'
}, {
update: {method: 'PUT'}
});
resource = tokenHandler.wrapActions( resource, ["query", "update"] );
return resource;
}])
Comme vous pouvez le voir la ressource est définie de la manière habituelle, en premier lieu. Dans mon exemple, cela inclut une action personnalisée appelait update
. Ensuite, la ressource est remplacé par le retour de l' tokenHandler.wrapAction()
méthode qui prend de la ressource et un tableau des actions en tant que paramètres.
Comme vous pouvez vous attendre la dernière méthode fait encapsule les actions à inclure dans auth jeton dans chaque requête et retourne une ressource modifié. Allons donc jeter un oeil sur le code pour que:
.factory('TokenHandler', function() {
var tokenHandler = {};
var token = "none";
tokenHandler.set = function( newToken ) {
token = newToken;
};
tokenHandler.get = function() {
return token;
};
// wrap given actions of a resource to send auth token with every
// request
tokenHandler.wrapActions = function( resource, actions ) {
// copy original resource
var wrappedResource = resource;
for (var i=0; i < actions.length; i++) {
tokenWrapper( wrappedResource, actions[i] );
};
// return modified copy of resource
return wrappedResource;
};
// wraps resource action to send request with auth token
var tokenWrapper = function( resource, action ) {
// copy original action
resource['_' + action] = resource[action];
// create new action wrapping the original and sending token
resource[action] = function( data, success, error){
return resource['_' + action](
angular.extend({}, data || {}, {access_token: tokenHandler.get()}),
success,
error
);
};
};
return tokenHandler;
});
Comme vous pouvez le voir l' wrapActions()
méthode crée une copie de la ressource à partir de ses paramètres et de boucles à travers l' actions
tableau pour appeler une autre fonction tokenWrapper()
pour chaque action. En fin de compte, il retourne la copie modifiée de la ressource.
L' tokenWrapper
méthode tout d'abord crée une copie de préexistante des ressources d'action. Cette copie a une fin trait de soulignement. Donc, query()
devient _query()
. Ensuite, une nouvelle méthode remplace l'original query()
méthode. Cette nouvelle méthode se terminera _query()
, comme suggéré par Andy Joslin, afin de fournir le jeton d'authentification à chaque demande d'envoyer par le biais de cette action.
La bonne chose avec cette approche est que l'on peut toujours utiliser les actions prédéfinies qui viennent avec chaque angularjs ressources (get, requête, enregistrer, etc.), sans avoir à les redéfinir. Et dans le reste du code (à moins de contrôleurs par exemple), nous pouvons utiliser la valeur par défaut nom de l'action.