2012-09-18 8 views
34

मेरे विचार में, मैं प्रस्तुत करना चाहता हूँकोणीय जेएस में उपयोगकर्ता परिभाषित कार्यों को कहां रखा जाए?</p> <pre><code><p> {{ say() }} </p> </code></pre> <p><code>say</code> जहां इस तरह के रूप में परिभाषित किया गया है:

say = function() { 
    return "Hello World"; 
} 

मैं अपने नियंत्रक में परिभाषित कर सकते हैं:

function TestCtrl($scope) { 
    $scope.say = function() { ... }; 
} 

लेकिन तब यह है केवल उस नियंत्रक के भीतर सुलभ।

यदि मैं कोणीय फ़ाइल संरचना के बाहर फ़ंक्शन को परिभाषित करता हूं, तो यह कुछ भी प्रस्तुत नहीं करता है। वैसे ही अगर मैं इसे अपने controllers.js फ़ाइल में परिभाषित करता हूं, लेकिन नियंत्रक फ़ंक्शन स्कोप के बाहर।

मेरे फ़ंक्शन को रखने के लिए उचित जगह कहां है, तो मैं इसे किसी भी नियंत्रक में प्रस्तुत कर सकता हूं?

उत्तर

48

एक तरीका है create a service उन कार्यों के साथ जिन्हें आप एकाधिक नियंत्रकों में साझा करना चाहते हैं। अधिक जानकारी के लिए this post देखें।

के बाद आप ऐसा करते हैं तो आप सेवा आप किसी भी नियंत्रक में बनाया इंजेक्षन और इस तरह कोड कुछ के साथ say() समारोह का उपयोग कर सकते हैं:

function TestCtrl($scope, myService){ 
    $scope.say = myService.say; 
} 

कहाँ आप के रूप में परिभाषित किया गया myService:

angular.module('myApp', []) 
    .factory('myService', function() { 
     return { 
      say: function() { 
       return "Hello World"; 
      } 
     } 
    }); 

यहाँ उदाहरण के साथ jsFiddle है।

+0

बहुत बढ़िया ... मैं इसे सेवाओं के साथ रहने की उम्मीद कर रहा था, लेकिन –

+5

में इसे जोड़ने के लिए सिंटैक्स नहीं मिला, बस एक वैकल्पिक वाक्यविन्यास (मैं 'कारखाना' के बजाय 'सेवा देखना/पढ़ना पसंद करता हूं' अगर मुझे केवल एक कन्स्ट्रक्टर फ़ंक्शन की आवश्यकता है): । सेवा ('myService', function() { this.say = function() {वापसी "हैलो वर्ल्ड";} }); –

+1

एक उचित सेवा के साथ "समस्या" यह है कि हर बार जब आप सेवा का उपयोग करते हैं, तो आपको उस सेवा का एक नया उदाहरण मिलता है। इस मामले में यह सबसे अच्छा विचार नहीं हो सकता है। – Spock

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