这可能很奇怪,但我需要使用模块的工厂方法为我的$ 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请求的默认数据。
答案 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);
}
),
},
});
}
]);