2012-06-28 83 views
15

这可能很奇怪,但我需要使用模块的工厂方法为我的$资源指定一些默认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请求的默认数据。

+1

你在这些数据中发送了什么?如果你发送一个令牌,你应该发送它在标题,不一定在postData ... – inf3rno

回答

18

这不是真正的角方式你失去了数据的一致性,如果你这样做,它不会在你的模型反映了做这样的事情。

为什么?

资源工厂创建对象并使用对象实例数据作为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

我想我们必须坚持,没有默认的POST值可以设置:) – Nimaen

0

包装功能将起作用。

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

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

这将工作确实,但不是我刚刚指出你的答案:) – Nimaen

2

我认为这将取决于你如何调用更新功能。如果您阅读角度主页的教程,在“连接后端”下,mongolab.js提供了一个'Project'工厂。逐字复制:

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

否则,你可以最有可能把键/值对在PARAMS:

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

它将与在URL中的键/值对张贴,但大多数应用服务器现在将引发对进入无论如何参数对象。

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(); 
}); 
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对象名单。

0

您可以通过使用transformRequest选项为您$资源使用该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); 
         } 
       ), 
       }, 
      }); 
    } 
]); 
2

我想大多数已经错过了文档here在一个很小的宝石。

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

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

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

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

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