वहाँ, पहले भाग जो एक उत्तर दे रहा है इस उत्तर के दो हिस्से हैं बेहतर विकल्प है, दूसरे भाग के तथ्य यह है कि उनमें से कोई भी एक अच्छा विकल्प है!
कौन सा सही है?
यह एक है:
$scope.addToDo = function(params1, ...) {
alert(params1);
}
क्यों? क्योंकि ए - यह टेस्टेबल है। यह महत्वपूर्ण है भले ही आप परीक्षण नहीं लिख रहे हों, क्योंकि टेस्टेबल कोड जो लंबे समय तक हमेशा अधिक पठनीय और रखरखाव योग्य होता है।
यह बी के कारण भी बेहतर है - कॉलर की बात होने पर यह अज्ञेयवादी है। इस फ़ंक्शन को किसी भी प्रकार के विभिन्न नियंत्रकों/सेवाओं/आदि द्वारा पुन: उपयोग किया जा सकता है क्योंकि यह किसी दायरे के अस्तित्व या उस दायरे की संरचना पर निर्भर नहीं है।
आप के बजाय ऐसा करने जब:
$scope.addToDo = function() {
alert($scope.params1);
}
दोनों ए और बी असफल। यह आसानी से परीक्षण योग्य नहीं है, और इसे आसानी से पुन: उपयोग नहीं किया जा सकता है क्योंकि जिस क्षेत्र में आप इसका उपयोग करते हैं, उसे अलग-अलग स्वरूपित किया जा सकता है।
संपादित करें: आप कुछ बहुत बारीकी से अपने विशिष्ट दायरे से बंधा कर रहे हैं और टेम्पलेट से समारोह चला रहे हैं, तो आप में स्थितियों के लिए जहां यह पुन: प्रयोज्य सिर्फ मतलब नहीं है बनाने की कोशिश कर बनाये जा सकते हैं। समारोह बस सामान्य नहीं है। उस स्थिति में, इससे परेशान न हों, कुछ कार्यों का पुन: उपयोग नहीं किया जा सकता है। देखें कि मैंने आपके डिफ़ॉल्ट मोड के बारे में क्या लिखा है लेकिन याद रखें कि कुछ मामलों में यह फिट नहीं होगा।
क्यों दोनों गलत कर रहे हैं?
क्योंकि एक सामान्य नियम के रूप में आपको अपने नियंत्रकों में तर्क नहीं करना चाहिए, यह एक सेवा का काम है। नियंत्रक एक सेवा का उपयोग कर सकते हैं और फ़ंक्शन को कॉल कर सकते हैं या इसे मॉडल में बेनकाब कर सकते हैं, लेकिन इसे परिभाषित नहीं करना चाहिए।
यह महत्वपूर्ण क्यों है? क्योंकि फिर से यह फ़ंक्शन का पुन: उपयोग करना आसान बनाता है। नियंत्रक में परिभाषित एक फ़ंक्शन को किसी अन्य नियंत्रक में पुन: उपयोग नहीं किया जा सकता है, इस पर सीमा डालने के बिना कि HTML में नियंत्रकों को कैसे बुलाया जाता है। एक सेवा में परिभाषित एक समारोह इंजेक्शन और पुन: उपयोग किया जा सकता है जहां भी आपको ऐसा लगता है।
लेकिन मुझे फ़ंक्शन का पुन: उपयोग करने की आवश्यकता नहीं है! - हाँ आप करते हैं! शायद अभी नहीं और शायद इस विशिष्ट कार्य के लिए कभी नहीं, लेकिन जल्द या बाद में आप एक ऐसे फ़ंक्शन का पुन: उपयोग करना चाहते हैं जिसे आप आश्वस्त करते हैं कि आपको कभी भी पुन: उपयोग करने की आवश्यकता नहीं होगी। और फिर आपको कोड को फिर से काम करना होगा कि आप पहले से ही भुला चुके हैं, जो हमेशा अतिरिक्त समय लेते हैं।
शुरुआत से ही इसे ठीक से करना बेहतर है और सेवाओं में आपके द्वारा किए जा सकने वाले सभी तर्कों को स्थानांतरित करना बेहतर है। इस तरह, यदि आपको कभी उन्हें कहीं और चाहिए (यहां तक कि किसी अन्य प्रोजेक्ट में) तो आप इसे पकड़ सकते हैं और इसे अपने वर्तमान स्कोप संरचना में फिट करने के लिए इसे फिर से लिखने के बिना इसका उपयोग कर सकते हैं।
बेशक, सेवाओं को आपके दायरे के बारे में पता नहीं है, इसलिए आपको पहले संस्करण का उपयोग करने के लिए मजबूर होना पड़ता है। बोनस!
app.service('ToDoService', [function(){
this.addToDo = function(params1, ...){
alert(params1);
}
}]);
और नियंत्रक के अंदर:: और एक सेवा के लिए पूरे दायरे गुजर का प्रलोभन, कि अंत कभी नहीं होगा अच्छी तरह से :-)
के लिए गिर नहीं है तो यह IMO सबसे अच्छा विकल्प है
$scope.addToDo = ToDoService.addToDo;
ध्यान दें कि मैं "सामान्य नियम" लिखा था। कुछ मामलों में एक सेवा के विरोध में नियंत्रक में फ़ंक्शन को परिभाषित करना उचित है। एक उदाहरण तब होगा जब फ़ंक्शन केवल विशिष्ट चीजों के दायरे से संबंधित हो, जैसे नियंत्रक में किसी राज्य को टॉगल करना। चीजों को अजीब बनने के बिना सेवा में ऐसा करने का कोई वास्तविक तरीका नहीं है।
लेकिन ऐसा लगता है कि यह मामला यहां नहीं है।
यह आमतौर पर दायरे का मामला है। यदि आप एक एनजी-दोहराना का उपयोग करते हैं जो प्रत्येक पुनरावृत्ति के लिए बाल स्कॉप्स बनाता है, तो आप आवृत्ति चर को पैरामीटर के रूप में पास करना चाहते हैं। अन्यथा आप नहीं जानते कि यह क्या है। इसके अलावा, मैं कहूंगा कि यह सिर्फ वरीयता और लेखन की आसानी है। –
मैंने [इस पोस्ट] पर स्कोप विरासत से संबंधित कुछ और शोध किए हैं (http://stackoverflow.com/questions/14049480/what-are-the-nuances-of-scope-prototypal-prototypical-inheritance-in-angularjs/14049482 # 140,494,820)। मेरे विशिष्ट प्रश्न को स्पष्ट करने के लिए, मैं एक विधि या किसी अन्य का उपयोग करने के संबंध में कुछ सर्वोत्तम प्रथाओं की तलाश में हूं। यदि वे समान हैं, तो वही दायरा मानते हैं, तो मैं उस उत्तर को स्वीकार करूंगा। –