默认的$ resource POST数据

时间:2012-06-28 07:25:30

标签: javascript angularjs

这可能很奇怪,但我需要使用模块的工厂方法为我的$ 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}}
    });
});

数据是我未来POST请求的默认数据。

6 个答案:

答案 0 :(得分:19)

这不是一种有角度的方式来做这样的事情,如果你这样做会丢失数据的一致性而且它没有反映在你的模型中。

<强>为什么吗

资源工厂创建对象并将对象实例数据用作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();

答案 1 :(得分:2)

我认为这取决于你如何调用更新功能。如果您阅读角度主页的教程,在&#34;连接后端&#34;下,mongolab.js提供了一个&#39;项目&#39;厂。逐字复制:

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中的键/值对进行POST,但现在大多数app服务器都会将该对抛出到params对象中。

答案 2 :(得分:0)

包装功能将起作用。

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

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

答案 3 :(得分:0)

这可以解决你的问题吗?

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

答案 4 :(得分:0)

你可以使用默认值merge你的参数。默认对象将提供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对象。

答案 5 :(得分:0)

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

例如像

这样的东西
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);
                      }
                  ),
               },
           });
    }
]);