AngularJS बीज: जावास्क्रिप्ट को अलग-अलग फाइलों (app.js, नियंत्रकों.js, directives.js, filter.js, services.js) में डाल रहा है।


93

मैं अपने आवेदन की संरचना के लिए कोणीय-बीज टेम्पलेट का उपयोग कर रहा हूं । शुरू में मैं एक एकल फाइल में मेरे सभी जावा स्क्रिप्ट कोड डाल main.js। इस फ़ाइल में मेरा मॉड्यूल घोषणा, नियंत्रक, निर्देश, फ़िल्टर और सेवाएं शामिल थीं। एप्लिकेशन इस तरह ठीक काम करता है, लेकिन मैं स्केलेबिलिटी और मेंटेनेंस को लेकर चिंतित हूं क्योंकि मेरा एप्लिकेशन अधिक जटिल हो गया है। मैंने देखा कि कोणीय-बीज टेम्पलेट में इनमें से प्रत्येक के लिए अलग-अलग फाइलें हैं, इसलिए मैंने main.jsइस प्रश्न में शीर्षक में उल्लिखित अन्य फाइलों में से प्रत्येक में एक फ़ाइल से अपने कोड को वितरित करने का प्रयास किया है और कोणीय की app/jsनिर्देशिका में पाया गया है -साइड टेम्प्लेट।

मेरा सवाल है: मैं काम करने के लिए आवेदन प्राप्त करने के लिए निर्भरता कैसे प्रबंधित करूं? मौजूदा प्रलेखन पाया यहाँ शो को देखते हुए एक भी जावास्क्रिप्ट स्रोत फ़ाइल उदाहरण के प्रत्येक के बाद से इस संबंध में बहुत स्पष्ट नहीं है।

मेरे पास जो है उसका एक उदाहरण है:

app.js

angular.module('myApp', 
    ['myApp.filters',
     'myApp.services',
     'myApp.controllers']);

controllers.js

angular.module('myApp.controllers', []).
    controller('AppCtrl', [function ($scope, $http, $filter, MyService) {

        $scope.myService = MyService; // found in services.js

        // other functions...
    }
]);

filters.js

angular.module('myApp.filters', []).
    filter('myFilter', [function (MyService) {
        return function(value) {
            if (MyService.data) { // test to ensure service is loaded
                for (var i = 0; i < MyService.data.length; i++) {
                    // code to return appropriate value from MyService
                }
            }
        }
    }]
);

services.js

angular.module('myApp.services', []).
    factory('MyService', function($http) {
        var MyService = {};
        $http.get('resources/data.json').success(function(response) {
            MyService.data = response;
        });
        return MyService;
    }
);

main.js

/* This is the single file I want to separate into the others */
var myApp = angular.module('myApp'), []);

myApp.factory('MyService', function($http) {
    // same code as in services.js
}

myApp.filter('myFilter', function(MyService) {
    // same code as in filters.js
}

function AppCtrl ($scope, $http, $filter, MyService) {
    // same code as in app.js
}

मैं आश्रितों का प्रबंधन कैसे करूँ?

अग्रिम में धन्यवाद।


2
इस बारे में कुछ लेख हैं। उदाहरण के लिए, briantford.com/blog/huuuuuge-angular-apps.html और कुछ प्रोजेक्ट, जैसे तुर्क । इससे संपर्क करने के दो तरीके हैं: परतों द्वारा घटकों को अलग करना (जैसे कोणीय-बीज) या फीचर द्वारा, जैसे कुछ लेख सुझाव देते हैं।
एडुआर्ड गमोनल

जब आप की घोषणा एक मॉड्यूल जैसे angular.module ( 'myApp.service1', []) मैं तुम्हारे पास निर्भरता जोड़ने की जरूरत है लगता है [] जैसे , angular.module ( 'myApp.service1', [ 'myApp.service2' 'MyApp .service2 '])। । मैं AngularJS के लिए बहुत नया हूं, इसलिए मैं गलत हो सकता हूं। यदि यह काम करता है, तो मुझे बताएं और मैं उत्तर दूंगा।
डैनी वारोड

उस लाइन को कहां डाला जाना चाहिए? मैं angular.module('myApp.services', ['myApp.services']);app.js में कोई भाग्य के साथ डाल दिया है ।
क्रिसडेवो

@ChrisDevo 1. जब आप टिप्पणियों का उत्तर देते हैं, तो हमेशा '@' और उपयोगकर्ता के नाम (रिक्त स्थान के बिना) के साथ टिप्पणी शुरू करें, इसलिए उपयोगकर्ता को एक सूचना मिलेगी। 2. myApp.services अन्य मॉड्यूल पर निर्भर होना चाहिए, न कि खुद पर angular.module('myApp.services', ['myApp.server', 'myApp.somethingElse'])
डैनी वारोड

@DannyVarod, क्या आपने अपनी पिछली टिप्पणी संपादित की है? मैंने इसे angular.module('myApp.service1', ['myApp.service1', 'myApp.service2'])मूल रूप से पढ़ा । अन्यथा मैं myApp.services को अपनी निर्भरता के रूप में शामिल नहीं करता।
क्रिसडेवो

जवाबों:


108

समस्या आपके सभी अलग-अलग फाइलों में आपके एप्लिकेशन मॉड्यूल को "रीडेक्लरिंग" करने के कारण होती है।

यह ऐप मॉड्यूल घोषणा है (निश्चित रूप से घोषणा सही शब्द है) ऐसा दिखता है:

angular.module('myApp', []).controller( //...

आपके आवेदन मॉड्यूल के अनुसार यह असाइनमेंट है (निश्चित नहीं है कि असाइनमेंट सही टर्म है या नहीं):

angular.module('myApp').controller( //...

वर्ग कोष्ठक की कमी पर ध्यान दें।

तो, पूर्व संस्करण, एक साथ वर्ग कोष्ठक, केवल आम तौर पर अपनी एक बार इस्तेमाल किया जाना चाहिए, app.jsया main.js। अन्य सभी संबंधित फाइलें - नियंत्रक, निर्देश, फिल्टर ... - बाद वाले संस्करण का उपयोग करना चाहिए, वर्ग कोष्ठक के बिना

मुझे उम्मीद है कि इसका कोई अर्थ है। चीयर्स!


9
मैंने इस मुद्दे का हल ढूंढ लिया है। ऐसा लगता है कि केवल एक मॉड्यूल की आवश्यकता है myApp। अपनी ऐप.जेएस फ़ाइल में मैंने var myApp = angular.module('myApp', []);इसके लिए एक संस्करण बनाया है अन्य सभी फाइलों में जिन्हें मैंने बस इस संस्करण के लिए संदर्भित किया है (उदाहरण के लिए, myApp.filter('myFilter', function(MyService) { /* filter code */ });जब तक मैंने अपने HTML में स्क्रिप्ट टैग में फ़ाइल नाम जोड़े हैं, मुझे किसी अन्य को घोषित करने की आवश्यकता नहीं है निर्भरताएं। इस संबंध में कोणीय-बीज परियोजना टेम्पलेट काफी भ्रामक है।
क्रिसडेवो

1
अब मैं वास्तव में भ्रमित हूँ। मैं वापस चले गए हैं और वैश्विक वर हटा दिया myApp, इतना है कि यह अब में एक गुमनाम मॉड्यूल है app.js: angular.module('myApp', ['myApp.filters', 'myApp.services', 'myApp.directives', 'myApp.controllers']);। अन्य सभी फाइलों में मैंने इस तरह गुमनाम मॉड्यूल भी घोषित किए angular.module('myApp.filter', []).filter('myFilter', function(MyService) { /* filter code */ });। मेरा ऐप अब इस तरह भी काम करता है। मैं अपने कोड इतिहास पर चला गया हूं और मैं यह नहीं देख सकता कि जहां मैं काम नहीं करता था, उसकी तुलना में यह कोई भिन्न है।
क्रिसडेवो

4
मैं आपसे यह काम करने का वादा करता हूं। मैं इसे हर एक दिन Angular Apps विकसित करने में उपयोग करता हूं। फिर, angular.module('myApp', []);मेरी मुख्य js फ़ाइल में एक (वर्ग कोष्ठक का नोटिस) की घोषणा है । फिर, अन्य सभी फाइलें angular.module('myApp').controllerया .directiveसिंटैक्स का उपयोग करके मॉड्यूल को संदर्भित करती हैं ।
जस्टिन एल।

5
त्रुटियों का कारण बनता है क्योंकि कोणीय myApp.controller, myApp.filters नामक मॉड्यूल की तलाश कर रहा है ... लेकिन, वे मॉड्यूल नहीं हैं, वे घटक हैं जो एक मॉड्यूल का विस्तार कर रहे हैं जिसे myApp कहा जाता है। सब कुछ काम करना चाहिए यदि आप अपने मॉड्यूल निर्भरता से अपने सभी myApp.whatever हटाये। बस वर्ग कोष्ठक खाली रखने के (जब तक आप, अन्य सच कोणीय मॉड्यूल शामिल कर रहे हैं जैसे ngCookies, ngResource) जब अपने मुख्य अनुप्रयोग मॉड्यूल की घोषणा:angular.module('myApp', []);
जस्टिन एल

1
आह ठीक है। अपने अनुप्रयोग मॉड्यूल के लिए एक निर्भरता के रूप में उन रखने से, यह त्रुटि होगा क्योंकि यह है उन्हें खोजने के लिए। यदि आप उन्हें चौकोर कोष्ठक से बाहर निकालते हैं, तो आप उन्हें अपनी इच्छानुसार लोड कर सकते हैं और आपका ऐप परवाह नहीं करेगा। ngResourceनिश्चित रूप से उनमें से एक है जिसे आप अपने मॉड्यूल घोषणा कोष्ठक में रखते हैं। अगर मेरे जवाब ने मदद की, तो मतदान करना और अनुमोदन करना बहुत सराहनीय होगा।
जस्टिन एल

12

यदि आप अपने एप्लिकेशन के विभिन्न भागों ( filters, services, controllers) को विभिन्न भौतिक फ़ाइलों में रखना चाहते हैं, तो आपको दो काम करने होंगे:

  1. अपनी app.jsया प्रत्येक फ़ाइल में उन नामस्थान (बेहतर अवधि की कमी के लिए) की घोषणा करें ;
  2. प्रत्येक फ़ाइलों में उन नामस्थानों का संदर्भ लें।

तो, आपका app.jsइस तरह दिखेगा:

angular.module('myApp', ['external-dependency-1', 'myApp.services', 'myApp.controllers'])
.run(function() {
   //...

})
.config(function() {
  //...
});

और प्रत्येक व्यक्तिगत फाइल में:

services.js

angular.module('myApp.services', []); //instantiates
angular.module('myApp.services') //gets
.factory('MyService', function() { 
  return {};
});

controllers.js

angular.module('myApp.controllers', []); //instantiates
angular.module('myApp.controllers')      //gets
.controller('MyCtrl', function($scope) {
  //snip...
})
.controller('AccountCtrl', function($scope) {
  //snip...
});

यह सब एक कॉल में जोड़ा जा सकता है:

controllers.js
angular.module('myApp.controllers', []) 
.controller('MyCtrl', function($scope) {
 //snip...
});    

महत्वपूर्ण हिस्सा यह है कि आपको फिर से परिभाषित नहीं करना चाहिए angular.module('myApp'); इसका कारण यह होगा कि जब आप अपने नियंत्रकों को तुरंत लिखेंगे, तो यह संभव नहीं होगा कि आप क्या चाहते हैं।


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

क्या होगा यदि मेरे पास दो नियंत्रक फाइलें या दो सेवाएं फाइलें हैं? क्या हर एक फाइल के लिए इंस्टेंटेज होगा?
अविनाश राज

3

आपको त्रुटि मिलती है क्योंकि आपने myApp.servicesअभी तक परिभाषित नहीं किया है। मैंने अभी तक जो कुछ किया है वह सभी प्रारंभिक परिभाषाओं को एक फ़ाइल में डाल रहा है और फिर उन्हें दूसरे में उपयोग करता है। आपके उदाहरण के लिए मैं इसमें डालूंगा:

app.js

angular.module('myApp.services', []);

angular.module('myApp', 
    ['myApp.services',
      ...]);

उस त्रुटि से छुटकारा मिलना चाहिए, हालांकि मुझे लगता है कि आपको टिप्पणियों में वर्णित एडुअर्ड गेमोनल के लेख पर एक पढ़ना चाहिए ।


धन्यवाद, Torsten, लेकिन मैं उस लेख पढ़ा है और angular.module('myApp.services', []);मेरे app.js फ़ाइल में लाइन गयी । न ही वास्तव में मेरी समस्या का समाधान है।
क्रिसडेवो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.