Javascript 默认$resource POST数据

Javascript 默认$resource POST数据,javascript,angularjs,Javascript,Angularjs,这可能很奇怪,但我需要使用模块的工厂方法为$resource指定一些默认的POST数据 有人知道如何在AngularJS中做到这一点吗 编辑: 嗯,我想这样做: /** * Module declaration. * @type {Object} */ var services = angular.module("services", ["ngResource"]); /** * Product handler service */ services.factory("Product

这可能很奇怪,但我需要使用模块的工厂方法为$resource指定一些默认的POST数据

有人知道如何在AngularJS中做到这一点吗

编辑:

嗯,我想这样做:

/** * 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}} }); }); /** *模块声明。 *@type{Object} */ var services=angular.module(“services”,“ngResource”); /** *产品处理服务 */ 服务.工厂(“产品”、功能($资源){ 返回$resource(“http://someUrl", {}, { get:{method:“get”,参数:{productId:“-1”}, 更新:{method:“POST”,参数:{},数据:{someDataKey:someDataValue} }); });
其中数据是我未来的POST请求的默认数据。

包装器函数将起作用

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

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

这并不是一种真正的角度方法,因为如果这样做,就会失去数据的一致性,并且不会反映在模型中

为什么?

资源工厂创建对象并使用对象实例数据作为POST。我查看了文档和angular-resource.js,似乎没有一种方法可以在不修改angular-resource.js的情况下为资源创建的对象指定任何默认自定义属性

您可以做的是:

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

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

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

我认为这将取决于如何调用update函数。如果您阅读angular主页的教程,在“连接后端”下,mongolab.js提供了一个“项目”工厂。逐字复制:

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;
});
用法是首先获取项目的实例:

project = Project.get({id:1});
然后在一些更改后执行更新:

project.update(someFunction);
在您的情况下,您可以更改更新以始终添加所需的数据:

Product.prototype.update = function(cb) {
  return Product.update({},
      angular.extend({}, this, {someDataKey: someDataValue}), cb);
};
否则,您很可能会将键/值对放在参数中:

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

它将与URL中的键/值对一起发布,但现在的大多数应用服务器都会将这对键/值扔到params对象中。

这能解决您的问题吗

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();
});
您可以仅使用默认值设置参数。默认对象将提供
params
中所有不可用的内容。可用的所有内容都将被
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
是变量列表,
myDefault
是json对象的默认值

您可以使用transformRequest选项为$resource使用POST方法的操作设置请求的默认字段

举个例子

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

我认为大多数人都错过了文档中的一个小亮点

这表明您可以执行以下操作

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

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

执行保存操作(post)时的第二个参数是post数据。

它确实可以工作,但不是我在您回答后指出的方式:)您在该数据中发送了什么?如果您发送一个令牌,您应该在头中发送它,而不一定在postData中……我想我们必须坚持这一点,不能设置默认的POST值:)
var User = $resource('/user');
postData = { name : 'Sunil', 'surname' : 'Shantha' };

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