2013-03-08 7 views
6

मैं एक संसाधन है कि एक प्रश्न से एक सरणी देता है, तो तरह से लौटे करने के तरीकों में जोड़ें ? (नोट, array.prototype पर नहीं)।एक संग्रह एक कोणीय संसाधन क्वेरी

उदाहरण के लिए, मैं संग्रह में hasBookWithTitle(title) जैसी विधियां जोड़ना चाहता हूं।

+0

देखें कि क्या यह [Angular.js में संसाधन संसाधनों में सहायता करता है] (http://stackoverflow.com/questions/9981090/resource-relations-in-angular-js)। – Stewie

उत्तर

4

डिफ़ॉल्ट संसाधन सेवा से लौटाए गए मानों के तरीकों को जोड़ने के बजाय संसाधनों को विस्तारित करने और इसे उपयोगिता विधियों को जोड़ने के लिए शायद यह एक अच्छा मामला है।

var myModule = angular.module('myModule', []); 
myModule.factory('Book', function() { 
    var service = $resource('/authors/:authorId/books'); 
    service.hasBookWithTitle = function(books, title){ 
     //blah blah return true false etc. 
    } 
    return service; 
}); 

तो

books = Book.list(function(){ 
    //check in the on complete method 
    var hasBook = Book.hasBookWithTitle(books, 'someTitle'); 
}) 
5

सुझाव ricick से एक अच्छा एक है, लेकिन अगर आप वास्तव में सरणी कि रिटर्न पर एक विधि करना चाहते हैं, तो आप एक कठिन समय है कि कर करना होगा। असल में आपको जो करना है वह $ संसाधन और उसके उदाहरणों के आसपास एक आवरण का थोड़ा सा बना है। समस्या आप में चलाने कोणीय resource.js से कोड की इस पंक्ति है:

var value = this instanceof Resource ? this : (action.isArray ? [] : new Resource(data)); 

यह जहां $ संसाधन से वापसी मान सेट किया गया है। क्या होता है "मूल्य" पॉप्युलेट होता है और अजाक्स अनुरोध निष्पादित होने पर लौटाया जाता है। जब AJAX अनुरोध पूरा हो जाता है, तो मान ऊपर "मान" में वापस आ जाता है, लेकिन संदर्भ द्वारा (angular.copy() विधि का उपयोग करके)। सरणी का प्रत्येक तत्व (क्वेरी() जैसी विधि के लिए) उस संसाधन का एक उदाहरण होगा जिस पर आप काम कर रहे हैं। फिर

var myModule = angular.module('myModule', ['ngResource']); 
myModule.factory('Book', function($resource) { 
    var service = $resource('/authors/:authorId/books'), 
     origQuery = service.prototype.$query; 

    service.prototype.$query = function (a1, a2, a3) { 
     var returnData = origQuery.call(this, a1, a2, a3); 
     returnData.myCustomMethod = function() { 
      // Create your custom method here... 
     return returnData; 
     } 
    } 

    return service; 
}); 

, आप इसे एक साथ गड़बड़ करना होगा:

तो एक तरह से आप इस कार्यक्षमता का विस्तार कर सकता है (गैर परीक्षण किया कोड है, तो शायद कुछ समायोजन के बिना काम नहीं करेगा) कुछ इस तरह होगा थोड़ा, लेकिन यह मूल विचार है।

2

कोणीय-resource.js (कम से कम 1.0.x श्रृंखला के लिए) में कोड को देखते हुए ऐसा नहीं लगता है कि आप किसी भी प्रकार के डिफ़ॉल्ट व्यवहार के लिए कॉलबैक में जोड़ सकते हैं (और यह सही डिज़ाइन जैसा लगता है मेरे लिए)।

आप सिर्फ एक नियंत्रक में मूल्य का उपयोग कर रहे हैं, तो आप एक कॉलबैक में पारित कर सकते हैं जब भी आप संसाधन पर query आह्वान:

var books = Book.query(function(data) { 
    data.hasBookWithTitle = function (title) { ... }; 
]); 

वैकल्पिक रूप से, आप एक सेवा है जो पुस्तकें संसाधन से सजाया गया बना सकते हैं , अग्रेषित/कॉल/सेव/आदि प्राप्त करने के लिए सभी कॉल, और अपनी विधि के साथ सरणी को सजाने के लिए। उदाहरण यहाँ फेंकना: http://plnkr.co/edit/NJkPcsuraxesyhxlJ8lg

app.factory("Books", 
    function ($resource) { 
    var self = this; 
    var resource = $resource("sample.json"); 

    return { 
     get: function(id) { return resource.get(id); }, 
     // implement whatever else you need, save, delete etc. 
     query: function() { 
     return resource.query(
      function(data) { // success callback 
      data.hasBookWithTitle = function(title) { 
       for (var i = 0; i < data.length; i++) { 
       if (title === data[i].title) { 
        return true; 
       } 
       } 
       return false; 
      }; 
      }, 
      function(data, response) { /* optional error callback */} 
     ); 
     } 
    }; 
    } 
); 

तीसरे, और मुझे लगता है कि यह बेहतर है, लेकिन यह अपनी आवश्यकताओं पर निर्भर करता है, तो आप सिर्फ कार्यात्मक दृष्टिकोण लेने के लिए और अपने नियंत्रक पर hasBookWithTitle समारोह रख सकते हैं, या अगर तर्क करने की जरूरत है एक उपयोगिता सेवा में साझा किया।

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