2012-06-28 18 views
15

To może być dziwne, ale muszę podać niektóre domyślne dane POST dla mojego zasobu $ przy użyciu metody fabrycznej modułu.

Czy ktoś ma pomysł, jak to zrobić w AngularJS?

EDIT:

Cóż, chcę zrobić coś takiego:

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

Jeżeli dane to dane domyślne dla moich przyszłych żądań POST.

+1

Co przesyłasz w tych danych? Jeśli wyślesz token, powinieneś wysłać go w nagłówkach, niekoniecznie w postData ... – inf3rno

Odpowiedz

18

To nie jest naprawdę kątowa sposób zrobić coś takiego jak stracić spójność danych, jeśli nie to i nie odzwierciedla w modelu.

Dlaczego?

Fabryka zasobów tworzy obiekt i używa danych instancji obiektu jako POST. Przyjrzałem się dokumentacji i angular-resource.js i wydaje się, że nie ma sposobu na określenie domyślnych właściwości niestandardowych dla obiektu tworzonego przez zasób bez modyfikowania pliku angular-resource.js.

Co można zrobić, to:

services.factory("Product", function($resource) { 
    return $resource("http://someUrl", {}, { 
     get : {method: "GET", params: {productId: "-1"}}, 
     update: {method : "POST"} 
    }); 
}); 

w kontrolerze:

$scope.product = {}; // your product data initialization stuff 
$scope.product.someDataKey = 'someDataValue'; // add your default data 

var product = new Product($scope.product); 
product.$update(); 
+1

Przypuszczam, że musimy się z tym trzymać, nie domyślne wartości POST można ustawić :) – Nimaen

0

Funkcja okładki będzie działać.

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

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

To zadziała, ale nie tak, jak wskazałem tuż po twojej odpowiedzi :) – Nimaen

2

myślę, że będzie to zależeć od sposobu wywołania funkcji aktualizacji. Jeśli przeczytasz samouczek kanciasty strony głównej, w sekcji "Podłącz do zaplecza" plik mongolab.js zawiera fabrykę "Projekt". Dosłownej:

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

Użycie jest, aby najpierw uzyskać instancję projektu:

project = Project.get({id:1}); 

następnie wykonać aktualizację po kilku zmianach:

project.update(someFunction); 

W twoim przypadku, można zmienić aktualizację, aby zawsze dodawać potrzebne dane:

Product.prototype.update = function(cb) { 
    return Product.update({}, 
     angular.extend({}, this, {someDataKey: someDataValue}), cb); 
}; 

W przeciwnym razie, można najprawdopodobniej umieścić parę klucz/wartość w params:

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

Będzie pisał z pary klucz/wartość w adresie URL, ale większość serwerów aplikacji w dzisiejszych czasach rzuci parę Into the i tak paruje obiekt.

0

Czy to rozwiąże Twój problem?

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

Możesz tylko merge swoich ustawień domyślnych. Wszystko nie dostępne w params zostanie dostarczone przez obiekt domyślny.Wszystko dostępne będą zastępowane przez myParams

services.factory("Product", function($resource) { 
    return $resource("http://someUrl", {}, { 
     get : {method: "GET", params: {productId: "-1"}}, 
     update: {method : "POST", params:angular.extend(myDefault, myParams);} 
    }); 
}); 

gdzie myParams byłaby lista zmiennych i myDefault swoimi wartościami domyślnymi jako obiekt JSON.

0

Można ustawić domyślne pól na żądanie za pomocą transformRequest opcję dla $ zasobu „s działań wykorzystujących POST metody.

Na przykład coś takiego

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

myślę najbardziej brakowało mały klejnot w dokumentacji here.

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

Sugeruje to, że można wykonać następujące czynności.

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

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

Drugim parametrem podczas działania zapisu (post) są dane pocztowe.