2012-10-18 27 views
27

मैंने हाल ही में जेएसआईआईंट का उपयोग करना शुरू कर दिया है और मुझे "सख्त उपयोग" के फ़ंक्शन फॉर्म का उपयोग करने की आवश्यकता है।कोणीय जेएस नियंत्रक और "सख्त उपयोग करें"

: तब से, AngularJS एक त्रुटि फेंकता है "त्रुटि: एक समारोह तर्क 'webAddressController' नहीं है, अपरिभाषित मिला"

जब मैं "का उपयोग सख्त" नियंत्रक लोड ठीक करने का कार्य विधि हटा दें।

नियंत्रक:

(function() { 
    "use strict"; 

    function webAddressController($scope, $rootScope, web_address_service) { 
      // Do things 
    } 

}()); 

किसी को भी यहाँ क्या हो रहा है पर किसी भी अंतर्दृष्टि है?

उत्तर

43

सबसे पहले, मैं यह कहना चाहता हूं कि pkozlowski वास्तव में कोणीय में अपनी सामग्री जानता है, लेकिन यह वास्तव में एक कोणीय मुद्दे के रूप में नहीं है क्योंकि यह बंद होने के साथ एक मुद्दा है।

कोणीय दो स्थानों पर नियंत्रकों के लिए लग रही है:

    Module.controller()
  1. एक वैश्विक चर में (या वैश्विक समारोह घोषणा) के माध्यम से
पंजीकृत नियंत्रकों का अपना ही रजिस्ट्री में
  • समस्या यह है कि "सख्त उपयोग" के लिए आपके बंद होने के अंदर सब कुछ वैश्विक नहीं है। यह लपेटा गया है और इसमें अज्ञात फ़ंक्शन में निजीकरण किया गया है।

    (function() { 
        // nothing in here is global or even public. 
        // "use strict" or not. 
    
        "use strict"; // this is mostly irrelevant. 
    
        // this will not work, because it's wrapped and not global 
        function ThisDoesntWork($scope) { 
        }; 
    
        // window is the global root variable. So this works. 
        window.ThisWorks = function($scope) { 
    
        }; 
    
        // this will work, because it's explicitly registering the controller 
        // presuming app is your Module variable from outside of the closure. 
        app.controller('ThisIsBest', function($scope) { 
    
        }); 
    
    })(); 
    
    //this works because it's global. 
    function ThisAlsoWorks($scope) { 
    
    } 
    
    // if you declare a global var, then set it inside 
    // of your closure, you're good to go too. 
    var ThisWillWorkToo; 
    
    (function { 
        //here we're setting it again. 
        ThisWillWorkToo = function($scope) { 
        }; 
    })(); 
    
    
    // if you're really crazy you can even do this... 
    var ThisWillWorkButItsWeird = (function() { 
         "use strict"; 
    
         function ThisWillWorkButItsWeird($scope) { 
    
         } 
    
         return ThisWillWorkButItsWeird; 
        })(); 
    

    दिन के अंत में, आप किसी भी फ़ंक्शन के अंदर "सख्त उपयोग" या फ़ाइल स्तर पर रख सकते हैं। "सख्त उपयोग करें" स्वयं आपके लिए कुछ तोड़ नहीं रहा है। नियंत्रक को पंजीकृत करने के हजारों तरीके हैं, जैसा कि आप देख सकते हैं। सबसे अच्छा विकल्प संभवतः उन्हें कंट्रोलर विधि के साथ स्पष्ट रूप से पंजीकृत करने के लिए सुझाव दिया गया है।

  • 14

    मुझे लगता है कि जेएसहिंट आपको वैश्विक चर से बचने के लिए यहां बताने की कोशिश कर रहा है (जो स्पष्ट रूप से एक बहुत अच्छा अभ्यास है!)।

    एंगुलरजेएस की एक ही समस्या को हल करने के बारे में थोड़ा अलग राय है (यानी - वैश्विक चर से परहेज करना) और आपको मॉड्यूल में नियंत्रकों को परिभाषित करने की अनुमति देता है (वैश्विक angular नामस्थान का उपयोग करके)। आप इस तरह के मॉड्यूल का उपयोग कर अपने उदाहरण पुनर्लेखन सकता है: http://jsfiddle.net/t3vBE/1/

    इस दृष्टिकोण आप नियंत्रक निर्माताओं के साथ ग्लोबल नेमस्पेस को दूषित नहीं कर रहे हैं के साथ:

    angular.module('myApp',[]).controller('webAddressController', function($scope) { 
        // Do things 
    }); 
    

    यहाँ jsFiddle व्यवहार में यह दर्शाता हुआ है।

    यदि आप सख्त मोड का उपयोग करना चाहते हैं तो आपको angular वैश्विक चर की अनुमति देने के लिए JSHint कॉन्फ़िगरेशन को बदलने की आवश्यकता होगी। वैकल्पिक रूप से आप भी अपने पूरे कोड (एक बार फिर से, मॉड्यूल का उपयोग करके) लपेट सकता है एक समारोह में कहा कि imediatelly निष्पादित हो जाता है:

    (function() { 
        "use strict"; 
    
    angular.module('myApp',[]).controller('webAddressController', function($scope) { 
    
        $scope.name = 'World'; 
        // Do things 
    }); 
    
    }());​ 
    

    यहाँ jsFiddle है: http://jsfiddle.net/t3vBE/4/

    मेरे लिए यह समझ में आता है केवल यदि आप चाहते हैं शुद्ध जावास्क्रिप्ट, "सहायक" कार्यों को परिभाषित करें, अन्यथा मैं AngularJS सेवाओं पर भरोसा करता हूं।

    +1

    द्वारा उत्पन्न किए गए किसी भी विचार पर आधारित है, मैं किसी भी आईआईएफई में 'सख्त उपयोग' घोषणा के साथ अपने सभी कोणीय कोड को लपेटने का कार्य कैसे स्वचालित कर सकता हूं? (मैं grunt का उपयोग कर रहा हूँ) –

    +0

    @FlorianF मैं व्यक्तिगत रूप से वेबस्टॉर्म –

    +2

    में लाइव टेम्पलेट का उपयोग करता हूं। जिशिंट चेतावनी वैश्विक चर को रोकने के लिए बिल्कुल नहीं है, बल्कि वैश्विक "सख्त उपयोग" की एक समान समस्या को रोकने के लिए है। यदि आप फ़ाइलों को एक साथ जोड़ते हैं (एक सामान्य निर्माण चरण) शीर्ष-स्तर "सख्त उपयोग" सभी निम्न फ़ाइलों पर लागू होगा (भले ही वे jshint के अनुरूप नहीं लिखे गए हों।) फ़ंक्शन फॉर्म केवल उस फ़ंक्शन पर jshint को सीमित करता है। –

    4

    अगर आपके कोणीय मॉड्यूल पहले से ही कहीं भरी हुई है @pkzolowski क्या कर रहा है क्या करने के लिए एक और तरीका है: angularjs defining services for the same module in different files

    Beware that using angular.module('myModule', []) will create the module myModule and overwrite any existing module named myModule. Use angular.module('myModule') to retrieve an existing module.

    1

    आप की कोशिश की है:

    var app = angular.module('myApp'); 
    app.controller(...); 
    app.service(...); 
    ... 
    

    यह यहाँ से टिप्पणी पर आधारित है लिखना 'बाहर सख्त' और पहले (फ़ंक्शन()

    "use strict"; // <-- add it here 
    (function() { 
        //"use strict"; <-- remove from here 
    
        function webAddressController($scope, $rootScope, web_address_service) { 
         // Do things 
        } 
    
    }()); 
    

    मेरा उत्तर उन फ़ाइलों पर आधारित है जो मैंने Yeoman

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