2014-09-19 17 views
8

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

उदाहरण के लिए:

updatePassword: { 
    url: ENV.NITRO_PROJECT_REST_URL + '/admins/:adminId/password', 
    method: 'PUT' 
} 

लेकिन फिर भी, मैं एक कस्टम क्रिया है कि था, नहीं एक कोड करने के लिए किया था, लेकिन दो पथ पैरामीटर:

technicianModule.controller('technician.teamCtrl', 
    ['$scope', '$state', '$stateParams', 'CommonService', 'TechnicianService', 'TeamService', 'TeamTechnicianService', 
    function($scope, $state, $stateParams, CommonService, TechnicianService, TeamService, TeamTechnicianService) { 

    $scope.add = function(teamId) { 
     TeamTechnicianService.add(teamId, $stateParams.technicianId, function() { 
     TeamService.get(teamId, function(data) { 
      $scope.teams.push(data); 
      $scope.unassignedTeams.splice(CommonService.getResourceIndex($scope.unassignedTeams, data), 1); 
     }); 
     }); 
    }; 

    } 
]); 

teamModule.factory('TeamTechnicianService', 
    ['RESTService', 
    function(RESTService) { 
    var factory = {}; 

    factory.add = function(teamId, technicianId, callback) { 
     return RESTService.TeamTechnician.add({teamId: teamId, technicianId: technicianId}).$promise.then(callback); 
    } 

    return factory; 
    } 
]); 

तो मैं पहली बार इसे पसंद कोडित:

TeamTechnician: $resource(ENV.NITRO_PROJECT_REST_URL + '/teamtechnicians/:teamtechnicianId', {}, { 
add: { 
    url: ENV.NITRO_PROJECT_REST_URL + '/teamtechnicians/:teamId/:technicianId', 
    method: 'POST' 
} 

लेकिन यह काम नहीं करेगा। पैरामीटर पास नहीं किए गए थे।

कुछ प्रयासों के बाद मुझे पता चला कि यह कस्टम क्रिया परिभाषा से ठीक पहले कुछ पैरामीटर परिभाषा जोड़ते समय काम करता था।

ऐसा लगता है कि होना ही था:

TeamTechnician: $resource(ENV.NITRO_PROJECT_REST_URL + '/teamtechnicians/:teamtechnicianId', { 
    teamId: '@teamId', 
    technicianId: '@technicianId' 
}, { 
add: { 
    url: ENV.NITRO_PROJECT_REST_URL + '/teamtechnicians/:teamId/:technicianId', 
    method: 'POST' 
} 

नोट की उपस्थिति:

teamId: '@teamId', 
technicianId: '@technicianId' 

मेरे समझ एक $ संसाधन परिभाषा, एक से अधिक पथ पैरामीटर है कि एक कस्टम क्रिया में तो वह था , उन्हें @ संकेतों के साथ परिभाषित करने की आवश्यकता है।

और जब यह केवल एक नहीं है।

वह क्यों है?

और क्यों संसाधन पैरामीटर संसाधन के ऊपर की बजाय कस्टम कार्रवाई में घोषित नहीं किया जा सकता है?

उत्तर

23

पैरामीटर प्रति कस्टम कार्रवाई घोषित किया जा सकता है।
डिफ़ॉल्ट पैरामीटर उनके नाम का तात्पर्य है: डिफ़ॉल्ट पैरामीटर (जैसा कि: "अन्य पैरामीटर प्रदान किए जाने पर उपयोग नहीं किया जाता है")।

'@' (या तो डिफ़ॉल्ट पैरामीटर या क्रिया पैरामीटर में) का उपयोग अनिवार्य नहीं है।
इसे सुविधा के रूप में प्रदान किया गया है और इसका एक विशेष अर्थ है।paramKey: '@someProp' का अर्थ है:
"उन तरीकों के लिए जिनके पास अनुरोध निकाय है (उदाहरण के लिए POST, PUT आदि), यदि मैं पैरामीटर paramKey पैरामीटर के लिए स्पष्ट रूप से कोई मान प्रदान नहीं करता हूं, तो कृपया someProp नाम की संपत्ति के लिए मेरी डेटा ऑब्जेक्ट देखें और इसके मूल्य का उपयोग करें paramKey पैरामीटर के मान के रूप में। "


नोट जब आप एक वर्ग विधि का उपयोग करें, आप स्पष्ट रूप से डेटा वस्तु प्रदान करने के लिए है:

SomeResourceClass.save({.../* data object */...}); 

आप एक उदाहरण विधि का उपयोग करते हैं, उदाहरण के ही डेटा वस्तु के रूप में कार्य करता है:

var instance = SomeResourceClass.get(...); 
instance.$save(); /* `instance` will act as the data object. */ 

देखें, भी, इस short demo


अद्यतन:

ऐसा लगता है कि आप निम्नलिखित कस्टम क्रिया कॉल करना चाहते हैं: अपेक्षा के अनुरूप काम नहीं है कि यह इस <ResourceClass>.add({teamId: teamId, technicianId: technicianId}) की तरह पर कॉल करना चाहते

add: { 
    url: ENV.NITRO_PROJECT_REST_URL + '/teamtechnicians/:teamId/:technicianId', 
    method: 'POST' 
} 

, के रूप में यह व्याख्या (होने का इरादा) डेटा ऑब्जेक्ट के रूप में ऑब्जेक्ट पैराम्स।

ngResource प्रलेखन से, "गैर GET" तरीकों के लिए विधि हस्ताक्षर (आपके जैसे) हैं:

  • गैर प्राप्त "वर्ग" कार्रवाई: Resource.action ([मापदंडों], POSTDATA, [ सफलता], [त्रुटि])
  • गैर प्राप्त उदाहरण कार्रवाई:। उदाहरण $ कार्रवाई ([मापदंडों], [सफलता], [त्रुटि])

ऊपर exerpt से, यह स्पष्ट है कि अगर आप केवल "ऑब्जेक्ट" एक्शन कॉल में एक ऑब्जेक्ट पास करें, फिर इसे data ob के रूप में समझा जाता है जेक्ट (अनुरोध का पेलोड)। इसके अतिरिक्त, यदि आपके पास @ -prefixed डिफ़ॉल्ट पैरामीटर हैं, तो URL पैरामीटर को उस data ऑब्जेक्ट के विरुद्ध हल किया जा रहा है (यही कारण है कि यह डिफ़ॉल्ट पैरामीटर के साथ काम करता है)।


कोणीय के लिए आदेश में एक params (और नहीं data वस्तु) के रूप में params वस्तु की व्याख्या करने में और के बाद से data परम अनिवार्य है, तो आप इसे इस फोन की जरूरत है: (वैकल्पिक रूप से

<ResourceClass>.add({teamId: teamId, technicianId: technicianId}, {}) 

, आप TeamTechnicianउदाहरण का उपयोग कर सकते हैं, लेकिन यह एक और कहानी है।)

+5

डिफ़ॉल्ट पैरामीटर की आपकी व्याख्या आधिकारिक दस्तावेज़ीकरण से अधिक मदद करती है। – Stephane

+0

ठीक है, पैरामीटर प्रति कस्टम कार्रवाई घोषित किया जा सकता है। लेकिन मुझे अपने POST अंक के लिए पैरामीटर की आवश्यकता क्यों नहीं है? – Stephane

+0

@StephaneEybert: पोस्ट और पुट विधियां समान रूप से हैंडल हैं, इसलिए कोई अंतर नहीं होना चाहिए। क्या आप एक बेवकूफ या कम से कम एक ** [एसएससीसीई] (http://sscce.org) ** प्रदान कर सकते हैं, तो मैं जिस समस्या का सामना कर रहा हूं उसे पुन: उत्पन्न कर सकता हूं? (बीटीडब्लू, अगर इस जवाब ने आपको उतारने और/या इसे स्वीकार करने में मदद नहीं की है।) – gkalpak

3

जब आप एक $ संसाधन परिभाषित परिभाषा इस

$resource(url, [paramDefaults], [actions]);

तरह लग रहा है दूसरा पैरामीटर paramDefaults सिर्फ वहाँ है डिफ़ॉल्ट मान प्रदान करने के लिए। @ वाक्यविन्यास का उपयोग PUT या POST अनुरोध के पेलोड से पैरामीटर मान प्राप्त करने के लिए किया जाता है।

वास्तव में संसाधन कार्रवाई का आह्वान करते समय आप हमेशा पैरामीटर मान प्रदान कर सकते हैं। यदि आप नहीं करते हैं तो डिफ़ॉल्ट पैरामीटर मान लिया जाता है और यदि वह भी वहां नहीं हैं तो खंड हटा दिया जाता है।

: सिंटैक्स का उपयोग करके संसाधन पर परिभाषित करने के लिए पैरामीटर की आवश्यकता क्या हो सकती है और यह डिफ़ॉल्ट मान के लिए भी जाता है। क्रिया विधि के लिए वे केवल $http config ऑब्जेक्ट लेते हैं।

+0

धन्यवाद लेकिन मेरा मूल प्रश्न यह था कि मेरा पुट कस्टम कार्रवाई क्यों करता है ot किसी भी पथ पैरामीटर की आवश्यकता है और मेरे पोस्ट कस्टम कार्रवाई की जरूरत है। – Stephane

+0

इस प्रकार आप विधियों को कॉल करते हैं और पैरामीटर पास करते हैं। यदि पैरामीटर पास नहीं किए जाते हैं तो paramDefaults से डिफ़ॉल्ट मान पास हो जाते हैं। – Chandermani

+0

मुझे डिफ़ॉल्ट मानों की आवश्यकता नहीं है। मैं पैरामीटर पास करता हूँ। केवल, ये नहीं देखा जाता है। मेरा मूल सवाल खड़ा है। – Stephane

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