2012-06-28 15 views
15

Puede ser extraño, pero debo especificar algunos datos POST predeterminados para mi $ recurso utilizando el método de fábrica del módulo.

¿Alguien tiene una idea de cómo hacer eso en AngularJS?

EDIT:

Bueno, quiero hacer algo como esto:

/** 
* Module declaration. 
* @type {Object} 
*/ 
var services = angular.module("services", ["ngResource"]); 

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

Cuando los datos son los datos por defecto para mis futuras peticiones POST.

+1

¿Qué se envía en esos datos? Si envía un token, debe enviarlo en encabezados, no necesariamente en postData ... – inf3rno

Respuesta

18

Esto no es realmente la forma angular a hacer tal cosa a medida que pierde consistencia de los datos, si lo haces y no refleja en su modelo.

¿Por qué?

La fábrica de recursos crea el objeto y utiliza datos de instancia de objeto como POST. He examinado la documentación y angular-resource.js y no parece haber una manera de especificar ninguna propiedad personalizada predeterminada para el objeto que está creando el recurso sin modificar angular-resource.js.

Lo que puede hacer es:

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

y en su controlador:

$scope.product = {}; // your product data initialization stuff 
$scope.product.someDataKey = 'someDataValue'; // add your default data 

var product = new Product($scope.product); 
product.$update(); 
+1

Supongo que tenemos que seguir con eso, no valores POST predeterminados se pueden establecer :) – Nimaen

0

La función del contenedor funcionará.

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

myPost().success(function(response) { ... }); 
+0

Funcionará de hecho, pero no de la manera que señalé justo después de su respuesta :) – Nimaen

2

Creo que va a depender de cómo se llama a la función de actualización. Si lees el tutorial de la página principal angular, en "Wire up a backend", el mongolab.js proporciona una fábrica de 'Proyecto'. Una copia literal:

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; 
}); 

El uso es que primero obtener una instancia del Proyecto:

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

Después, realice una actualización después de algunos cambios:

project.update(someFunction); 

En su caso, puede cambiar la actualización para agregar siempre los datos que necesita:

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

De lo contrario, puede más probable es poner el par clave/valor en los params:

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

se difundirá con el par clave/valor en la URL, pero la mayoría de los servidores de aplicaciones hoy en día arrojará el par en el params objeto de todos modos.

0

¿Podría solucionar este problema?

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(); 
}); 
0

Usted puede simplemente merge sus parametros con el valor predeterminado. Todo no disponible en params será provisto por el objeto predeterminado.Todo lo disponible será sobrescrita por myParams

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

donde myParams sería su lista de variables y sus valores por defecto myDefault como un objeto JSON.

0

Puede configurar campos predeterminados en su solicitud utilizando opción transformRequest para su $ recurso acciones 's que utilizan el método dePOST.

Por ejemplo algo como esto

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); 
         } 
       ), 
       }, 
      }); 
    } 
]); 
2

creo que la mayoría han perdido una pequeña joya en la documentación here.

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

Esto sugiere que puede hacer lo siguiente.

var User = $resource('/user'); 
postData = { name : 'Sunil', 'surname' : 'Shantha' }; 

var user = User.save({notify:'true'}, postData, function() { 
    // success! 
}); 

El segundo parámetro cuando se realiza una acción de guardado (publicación) son los datos de la publicación.

Cuestiones relacionadas