Angularjs – personnaliser $ resource

J'utilise Angular $resource pour le service REST. En raison de la quirk dans ma réponse, je ne peux pas utiliser $ service de ressources pour l'application CRUD.

Création d'un nouveau travail d'objet (par exemple pour Card), smilar to:

 var newCard = new CreditCard(); newCard.name = "Mike Smith"; newCard.$save(); 

Obtenez également des travaux:

 var card = CreditCard().get({_id:1) 

Mais, la réponse GET n'est pas l'objet Card lui-même, mais un autre message avec lui (objet wrapper)

 { message: ".....", response: Card //object } 

Alors, lorsque je sauvegarde l'instance récupérée via la ressource, elle envoie l'objet wrapper (avec l'objet de carte modifié dans le champ de réponse). Cela est probablement correct, mais mon serveur s'attend à ce que l'objet Card ne soit pas le wrapper. Existe-t-il un moyen de personnaliser $ resource pour qu'il envoie l'objet souhaité. Du document, il semble que seul les paramètres de l'URL peuvent être modifiés.

 $resource(url[, paramDefaults][, actions]); 

J'ai également eu des problèmes avec l'implémentation standard dans le module de ressources $. Pendant un certain temps, je viens d'effectuer des modifications dans ma propre copie locale du fichier de ressources $, mais j'ai constaté que j'étais encore mécontent de la façon dont ils ont implémenté les ressources REST. J'avais besoin de plus de souplesse que celle offerte.

Le module de ressources $ standard est juste un emballage d'usine autour de $ http. Si vous réduisez le code dans le module de ressources $, vous pouvez créer votre propre implémentation personnalisée assez facilement.

 var app = angular.module('app', []); app.factory('CreditCard', ['$http', function($http) { function CreditCardFactory() { function parseMessage(message) { if (message.response) { return message.response; } } function CreditCard(value) { angular.copy(value || {}, this); } CreditCard.$get = function(id) { var value = this instanceof CreditCard ? this : new CreditCard(); $http({ method: 'GET', url: '/creditcards/' + id }).then(function(response) { var data = response.data; if (data) { angular.copy(parseMessage(data), value); } }); return value; }; CreditCard.prototype.$get = function(id) { CreditCard.$get.call(this, id); }; return CreditCard; } return CreditCardFactory; }]); 

Ensuite, dans votre fonction de contrôleur, injectez l'usine CreditCard comme vous le feriez.

 app.controller('CreditCardCtrl', function($scope, CreditCard) { $scope.creditCard = CreditCard().get(3); }); 

Cela vous permet d'analyser les réponses de vos actions REST de toute façon, et vous permet également de mettre en œuvre toutes les actions souhaitées. Par exemple: je voulais une méthode de sauvegarde sur mes ressources qui vérifierait si l'objet avait une propriété d'identification avant de choisir d'utiliser un POST (création d'une nouvelle ressource quand aucun identifiant n'est disponible) ou un PUT (mise à jour d'une ressource existante lorsqu'un Id valide est disponible).

Cela vous permettra également de mettre en œuvre une autre manière de gérer la vulnérabilité JSON CSRF . La façon angular.js est intégrée à $ http, mais l'API REST de ma société corrige ce problème en enveloppant les tableaux JSON dans un objet fictif. J'utilise une ressource personnalisée comme celle ci-dessus pour analyser l'objet fictif.