Данные 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);
                      }
                  ),
               },
           });
    }
]);