Angularjs सबसे अच्छा अभ्यास करते हैं


103

मैं http://www.alexrothenberg.com/2013/02/11/the-magic-behind-angularjs-d dependency-injection.html पढ़ रहा हूं और यह पता चला है कि अगर आप अपनी जावास्क्रिप्ट को छोटा करते हैं तो कोणीयज निर्भरता इंजेक्शन में समस्या है। अगर इसके बजाय सोच रहा हूँ

var MyController = function($scope, $http) {
    $http.get('https://api.github.com/repos/angular/angular.js/commits')
      .then(function(response) {
        $scope.commits = response.data
      })
  }

आपको उपयोग करना चाहिए

var MyController = ['$scope', '$http', function($scope, $http) {
  $http.get('https://api.github.com/repos/angular/angular.js/commits')
    .then(function(response) {
      $scope.commits = response.data
    })
}]

सभी सभी में मुझे लगा कि दूसरा स्निपेट कोणीयज के पुराने संस्करण के लिए था लेकिन ...।

क्या मुझे हमेशा इंजेक्शन का तरीका (दूसरा वाला) इस्तेमाल करना चाहिए?

जवाबों:


102

हाँ , हमेशा! तो इस तरह से भले ही आपका मिनिफ़र $ a और $ http को वेरिएबल b में स्कोप में कनवर्ट करता हो, स्ट्रिंग्स में उनकी पहचान अभी भी संरक्षित है।

AngularJS डॉक्स के इस पृष्ठ को देखें , न्यूनतम नोट पर स्क्रॉल करें

अपडेट करें

वैकल्पिक रूप से, आप इस क्रिया से बचने के लिए अपनी बिल्ड प्रक्रिया में एन-एनोटेट एनपीएम पैकेज का उपयोग कर सकते हैं ।


यह, और कुछ अन्य मुद्दों को egghead.io पर बहुत अच्छा समझाया गया है। JFYI
Wottensprels

@Sprottenwels: हाँ! वहाँ उपयोगी संसाधनों की बहुत।
सेल्वम पलानीमलाई

8
इस अधिक वर्बोज़ सिंटैक्स का उपयोग करने के बजाय आप मिनिमन चलाने से पहले एनक्मिन और एक बिल्ड टूल (जैसे ग्रंट) का उपयोग कर सकते हैं। इस तरह से आप ठीक से खनन कर सकते हैं, लेकिन निर्भरता इंजेक्शन सिंटैक्स का भी उपयोग कर सकते हैं।
::

4
नोटिफिकेशन पर एक नोट यहाँ docs.angularjs.org/tutorial/step_07
Razvan.432


36

दूसरे वेरिएंट का उपयोग करना अधिक सुरक्षित है लेकिन एनकैम के साथ पहले वेरिएंट का सुरक्षित रूप से उपयोग करना भी संभव है ।

अद्यतन:
अब एनजी एनोटेट इस मुद्दे को हल करने के लिए एक नया डिफ़ॉल्ट उपकरण बन जाता है।


7

हां, आपको स्पष्ट निर्भरता इंजेक्शन (दूसरा संस्करण) का उपयोग करने की आवश्यकता है । लेकिन एंगुलर 1.3.1 के बाद से आप अंतर्निहित निर्भरता इंजेक्शन को बंद कर सकते हैं , यह एक बार (नाम बदलने से पहले) नाम बदलने के साथ संभावित समस्याओं को हल करने में मददगार है।

strictDiकॉन्फ़िगर की गई संपत्ति का उपयोग करके अंतर्निहित DI को बंद करना :

angular.bootstrap(document, ['myApp'], {
    strictDi: true
});

ng-strict-diनिर्देश का उपयोग करते हुए, अंतर्निहित DI को बंद करना :

<html ng-app="myApp" ng-strict-di>

7

बस यह इंगित करने के लिए कि यदि आप उपयोग करते हैं

फ़र्मर

ऐसा करने की कोई आवश्यकता नहीं है

var MyController = ['$scope', '$http', function($scope, $http) {
  $http.get('https://api.github.com/repos/angular/angular.js/commits')
    .then(function(response) {
      $scope.commits = response.data
    })
}]

क्योंकि minify के दौरान ग्रंट डीआई को प्रबंधित करने के तरीके को ध्यान में रखते हैं।


1

जैसे OZ_ ने कहा, सभी कोणीय js फ़ाइल को मिनिमाइज़ करने के लिए ngmin का उपयोग करें, जैसे निर्देश। js service.js। उसके बाद आप इसे अनुकूलित करने के लिए क्लोजर कंपाइलर का उपयोग कर सकते हैं।

संदर्भ:

कोणीयज स्क्रिप्ट को कैसे छोटा करें

YO के साथ बनाएँ


0

आप यहां$inject बताए अनुसार उपयोग करना चाहते हैं :

MyController.$inject = ['$scope', '$http'];

function MyController($scope, $http) {
  $http.get('https://api.github.com/repos/angular/angular.js/commits')
    .then(function(response) {
      $scope.commits = response.data
    })
}

0

समस्याओं का निदान करने के लिए सख्त निर्भरता इंजेक्शन का उपयोग करें

इम्प्लिक्ट एनोटेशन के साथ, मिनिफ़ाइ किए जाने पर कोड टूट जाएगा।

डॉक्स से:

इम्प्लिमेंट एनोटेशन

सावधान: यदि आप अपने कोड को छोटा करने की योजना बनाते हैं, तो आपके सेवा नामों का नाम बदलकर आपका ऐप टूट जाएगा।

आप ng-strict-diउसी तत्व पर एक निर्देश जोड़ सकते हैं जिसमें ng-appसख्त DI मोड का चयन किया जा सकता है।

<body ng-app="myApp" ng-strict-di>

जब भी कोई सेवा अंतर्निहित एनोटेशन का उपयोग करने की कोशिश करती है, तो स्ट्रिक्ट मोड एक त्रुटि फेंकता है।

यह समस्याओं का पता लगाने के लिए उपयोगी हो सकता है।

अधिक जानकारी के लिए देखें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.