2012-06-28 19 views
15

Potrebbe essere strano ma è necessario specificare alcuni dati POST predefiniti per la mia risorsa $ utilizzando il metodo factory del modulo.

Qualcuno ha un'idea di come farlo in AngularJS?

EDIT:

Beh, io voglio fare qualcosa di simile:

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

cui i dati sono i dati di default per il mio futuro richieste POST.

+1

Cosa spedisci in quei dati? Se si invia un token, è necessario inviarlo nelle intestazioni, non necessariamente in postData ... – inf3rno

risposta

18

Questo non è davvero il modo angolare di fare una cosa come si perde la coerenza dei dati, se lo si fa e non riflette nel modello.

Perché?

Il factory di risorse crea l'oggetto e utilizza i dati di istanza dell'oggetto come POST. Ho esaminato la documentazione e angular-resource.js e non sembra esserci un modo per specificare le proprietà personalizzate di default per l'oggetto creato dalla risorsa senza modificare angular-resource.js.

Che cosa si può fare è:

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

e nel controllore:

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

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

Suppongo che dobbiamo attenerci, no i valori POST predefiniti possono essere impostati :) – Nimaen

0

La funzione wrapper funzionerà.

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

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

Funzionerà davvero, ma non il modo in cui ho indicato solo dopo la risposta :) – Nimaen

2

penso che dipenderà da come si chiama la funzione di aggiornamento. Se leggi il tutorial della pagina principale angolare, sotto "Collega un back-end", mongolab.js fornisce una fabbrica "Progetto". Riprodotto alla lettera:

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

L'utilizzo è che in primo luogo ottenere un'istanza del progetto:

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

Poi fare un aggiornamento dopo alcuni cambiamenti:

project.update(someFunction); 

Nel tuo caso, si puoi modificare l'aggiornamento per aggiungere sempre i dati che ti servono:

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

In caso contrario, si può probabilmente mettere la coppia chiave/valore nelle params:

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

sarà pubblicato con la coppia chiave/valore nella URL, ma la maggior parte dei server di applicazioni al giorno d'oggi getterà la coppia nel i params obiettano comunque.

0

Potrebbe questo risolvere il tuo problema?

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

È possibile solo merge i parametri con il valore predefinito. Tutto il non disponibile in params verrà fornito dall'oggetto predefinito.Tutto disponibile sarà sovrascritto dal myParams

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

dove myParams sarebbe la vostra lista di variabili e myDefault i tuoi valori di default come un oggetto JSON.

0

È possibile impostare campi predefiniti su vostra richiesta utilizzando transformRequest opzione per il vostro $ risorsa 's azioni che utilizzano il metodo POST .

Per esempio qualcosa di simile

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

penso che la maggior parte hanno perso un piccolo gioiello nella documentazione here.

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

Questo suggerisce che è possibile effettuare quanto segue.

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

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

Il secondo parametro quando si esegue un'azione di salvataggio (post) è dati post.