Данные POST по умолчанию $resource
Это может быть странно, но мне нужно указать некоторые данные POST по умолчанию для моего ресурса $с помощью метода factory модуля.
Есть ли у кого-нибудь представление о том, как это сделать в 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
На самом деле это не способ angular делать такую вещь, как вы теряете согласованность данных, если вы это делаете, и это не отражается в вашей модели.
Почему?
Ресурс factory создает объект и использует данные экземпляра объекта как 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();
Ответ 2
Я думаю, это будет зависеть от того, как вы вызываете функцию обновления. Если вы прочитали учебник по главной странице angular, в разделе "Подключить бэкэнд", mongolab.js предоставляет "Проект" factory. Скопировано дословно:
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}}
Он будет POSTED с парой ключ/значение в URL-адресе, но большинство серверов приложений в настоящее время все равно выбросят пар в объект params.
Ответ 3
Я думаю, что большинство из них пропустили крошечный камень в документации здесь.
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) - это данные post.
Ответ 4
Функция Wrapper будет работать.
function myPost(data) {
return $http.post('http://google.com', angular.extend({default: 'value'}, data))
}
myPost().success(function(response) { ... });
Ответ 5
Может ли это решить вашу проблему?
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();
});
Ответ 6
Вы можете просто объединить ваши параметры со значением по умолчанию. Объект , доступный в 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.
Ответ 7
Вы можете установить поля по умолчанию для своего запроса, используя параметр 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);
}
),
},
});
}
]);