2012-06-28 16 views
15

यह अजीब हो सकता है लेकिन मुझे मॉड्यूल की फैक्टरी विधि का उपयोग करके अपने $ संसाधन के लिए कुछ डिफ़ॉल्ट पोस्ट डेटा निर्दिष्ट करने की आवश्यकता है।

क्या किसी को एंगुलरजेएस में ऐसा करने का विचार है?

संपादित करें:

ठीक है, मैं इस तरह कुछ करना चाहता हूँ:

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

कहाँ डेटा मेरे भविष्य पोस्ट अनुरोध के लिए डिफ़ॉल्ट डेटा है।

+1

आप उस डेटा में क्या भेजते हैं? यदि आप टोकन भेजते हैं, तो आपको इसे हेडर्स में भेजना चाहिए, जरूरी नहीं कि पोस्टडाटा में ... – inf3rno

उत्तर

18

यह वास्तव में ऐसा करने के लिए के रूप में आप डेटा स्थिरता खो अगर आप इसे करते हैं और इसे अपने मॉडल में प्रतिबिंबित नहीं करता कोणीय तरीका नहीं है।

क्यों?

संसाधन फैक्ट्री ऑब्जेक्ट बनाता है और ऑब्जेक्ट इंस्टेंस डेटा को POST के रूप में उपयोग करता है। मैंने प्रलेखन और कोणीय-संसाधन.जेएस को देखा है और कोणीय-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

मुझे लगता है कि हमें इसके साथ रहना है, नहीं डिफ़ॉल्ट पोस्ट मूल्य सेट किया जा सकता है :) – Nimaen

0

रैपर फ़ंक्शन काम करेगा।

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

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

यह वास्तव में काम करेगा, लेकिन जिस तरह से मैंने आपके उत्तर के बाद ही बताया था :) – Nimaen

2

मुझे लगता है कि आप कैसे अद्यतन फ़ंक्शन को कॉल पर निर्भर करेगा। यदि आप कोणीय मुख्य पृष्ठ के ट्यूटोरियल को पढ़ते हैं, तो "वायर अप बैकएंड" के तहत, mongolab.js एक 'प्रोजेक्ट' फैक्ट्री प्रदान करता है। शब्दशः कॉपी किया गया:,

project.update(someFunction); 

अपने मामले में आप:

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

तो कुछ बदलाव के बाद एक अद्यतन कार्य करें:

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

उपयोग है कि आप पहले परियोजना का एक उदाहरण मिलता है आपको आवश्यक डेटा जोड़ने के लिए अद्यतन को बदल सकते हैं:

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

अन्यथा, आप सबसे अधिक संभावना पैरामीटर में मुख्य/मान जोड़े रख सकते हैं:

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

यह URL में मुख्य/मान जोड़े के साथ तैनात किया जाएगा, लेकिन सबसे एप्लिकेशन सर्वर आजकल में जोड़ी फेंक होगा वैसे भी पैराम ऑब्जेक्ट।

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(); 
}); 
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 चर और एक json वस्तु के रूप में myDefault अपने मूलभूत मूल्यों की अपनी सूची होगी।

0

आप अपने $ संसाधन की कार्रवाई है कि पोस्ट विधि का उपयोग के लिए transformRequest विकल्प का उपयोग करके आपके अनुरोध पर डिफ़ॉल्ट फ़ील्ड सेट कर सकते हैं।

उदाहरण के लिए इस

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

की तरह कुछ मुझे लगता है कि सबसे प्रलेखन here में एक छोटे से मणि छूट गई है।

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

सहेजने की क्रिया (पोस्ट) करते समय दूसरा पैरामीटर पोस्ट डेटा है।

संबंधित मुद्दे