Valeur par défaut $ POST données

Cela pourrait être étrange, mais je dois spécifier certaines données POST par défaut pour ma ressource $ en utilisant la méthode d'usine du module.

Est-ce que quelqu'un a une idée de comment faire cela dans AngularJS?

MODIFIER :

Eh bien, je veux faire quelque chose comme ça:

  / **
  * Déclaration du module.
  * @type {Object}
  * /
 Var services = angular.module ("services", ["ngResource"]);

 / **
  * Service de traitement de produit
  * /
 Services.factory ("Produit", fonction ($ resource) {
     Retourne $ resource ("http: // someUrl", {}, {
         Get: {method: "GET", params: {productId: "-1"}},
         Mise à jour: {method: "POST", params: {}, data: {someDataKey: someDataValue} }
     });
 }); 

Lorsque les données sont les données par défaut pour mes futures demandes POST.

Ce n'est pas vraiment la façon angulaire de faire une telle chose que vous perdez la cohérence des données si vous le faites et ne reflète pas dans votre modèle.

Pourquoi?

L'usine de ressource crée l'objet et utilise les données d'instance d'objet comme POST. J'ai examiné la documentation et angular-resource.js et il ne semble pas y avoir de moyen de spécifier des propriétés personnalisées par défaut pour l'objet créé par la ressource sans modifier angular-resource.js.

Ce que vous pouvez faire, c'est:

services.factory("Product", function($resource) { return $resource("http://someUrl", {}, { get : {method: "GET", params: {productId: "-1"}}, update: {method : "POST"} }); }); 

Et dans votre contrôleur:

 $scope.product = {}; // your product data initialization stuff $scope.product.someDataKey = 'someDataValue'; // add your default data var product = new Product($scope.product); product.$update(); 

Je pense que cela dépendra de la façon dont vous appelez la fonction de mise à jour. Si vous lisez le tutoriel de la page principale angulaire, sous "Wire up a Backend", le mongolab.js fournit une usine 'Project'. Copié textuellement:

 angular.module('mongolab', ['ngResource']). factory('Project', function($resource) { var Project = $resource('https://api.mongolab.com/api/1/databases' + '/angularjs/collections/projects/:id', { apiKey: '4f847ad3e4b08a2eed5f3b54' }, { update: { method: 'PUT' } } ); Project.prototype.update = function(cb) { return Project.update({id: this._id.$oid}, angular.extend({}, this, {_id:undefined}), cb); }; Project.prototype.destroy = function(cb) { return Project.remove({id: this._id.$oid}, cb); }; return Project; }); 

L'utilisation est que vous obtenez d'abord une instance du projet:

 project = Project.get({id:1}); 

Ensuite, effectuez une mise à jour après quelques modifications:

 project.update(someFunction); 

Dans votre cas, vous pouvez modifier la mise à jour pour toujours ajouter les données dont vous avez besoin:

 Product.prototype.update = function(cb) { return Product.update({}, angular.extend({}, this, {someDataKey: someDataValue}), cb); }; 

Sinon, vous pouvez probablement mettre la paire clé / valeur dans les paramètres:

  update: {method : "POST", params:{someDataKey: someDataValue}} 

Il sera POSTÉ avec la paire clé / valeur dans l'URL, mais la plupart des serveurs d'applications lancent aujourd'hui la paire dans l'objet Params de toute façon.

Je pense que la plupart ont manqué un petit bijou dans la documentation ici .

 non-GET "class" actions: Resource.action([parameters], postData, [success], [error]) 

Cela suggère que vous pouvez faire ce qui suit.

 var User = $resource('/user'); postData = { name : 'Sunil', 'surname' : 'Shantha' }; var user = User.save({notify:'true'}, postData, function() { // success! }); 

Le deuxième paramètre lors de la sauvegarde d'une action (post) est la publication de données.

La fonction Wrapper fonctionnera.

 function myPost(data) { return $http.post('http://google.com', angular.extend({default: 'value'}, data)) } myPost().success(function(response) { ... }); 

Cela pourrait-il résoudre votre problème?

 services.factory("Product", function($resource) { return $resource("http://someUrl", {}, { get : {method: "GET", params: {productId: "-1"}}, update: {method : "POST", params:{}, data: {someDataKey: someDataValue}} }); }); services.factory("DefaultProduct", function(Product) { return function(){ return new Product({ data:"default"; }); }; }); services.controller("ProductCTRL",function($scope,DefaultProduct){ $scope.product = new DefaultProduct(); }); 

Vous pouvez simplement fusionner vos paramètres par défaut. Tout ce qui n'est pas disponible dans les params sera fourni par l'objet par défaut. Tout ce qui sera disponible sera écrasé par myParams

 services.factory("Product", function($resource) { return $resource("http://someUrl", {}, { get : {method: "GET", params: {productId: "-1"}}, update: {method : "POST", params:angular.extend(myDefault, myParams);} }); }); 

myParams serait votre liste de variables et myDefault vos valeurs par défaut comme objet json.

Vous pouvez définir des champs par défaut dans votre demande en utilisant l'option transformRequest pour les actions de votre ressource utilisées par la méthode POST .

Par exemple, quelque chose comme ça

 function prependTransform(defaults, transform) { // We can't guarantee that the default transformation is an array defaults = angular.isArray(defaults) ? defaults : [defaults]; // Append the new transformation to the defaults return [transform].concat(defaults); } ctrl.factory('MyResource', ['$resource', '$http', function($resource, $http) { return $resource('/path/to/myresource/:id', {id : '@id'}, { create : { method : 'POST', transformRequest : prependTransform($http.defaults.transformRequest, function(data, headers) { return addDefaultField(data); } ), }, }); } ]);