AngularJS में मॉड्यूल और नामस्थान/नाम टकराव




namespaces collision (4)

दुर्भाग्य से, AngularJS में कोई namespacing नहीं है। एक समाधान एक prefix का उपयोग करना है (दूसरा समाधान this हो सकता है!)। निम्नलिखित उदाहरण देखें:

// root app
const rootApp = angular.module('root-app', ['app1', 'app2']);

// app 1
const app1 = angular.module('app1', []);
app1.controller('app1.main', function($scope) {
  $scope.msg = 'App1';
});

// app2
const app2 = angular.module('app2', []);
app1.controller('app2.main', function($scope) {
  $scope.msg = 'App2';
})
<!-- [email protected] -->
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.7.0/angular.min.js"></script>

<!-- root app -->
<div ng-app="root-app">

  <!-- app 1 -->
  <div ng-controller="app1.main">
    {{msg}}
  </div>

  <!-- app 2 -->
  <div ng-controller="app2.main">
    {{msg}}
  </div>

</div>

निम्नलिखित जफल्ड पर विचार करें http://jsfiddle.net/bchapman26/9uUBU/29/

//angular.js example for factory vs service
var app = angular.module('myApp', ['module1', 'module2']);

var service1module = angular.module('module1', []);

service1module.factory('myService', function() {
    return {
        sayHello: function(text) {
            return "Service1 says \"Hello " + text + "\"";
        },
        sayGoodbye: function(text) {
            return "Service1 says \"Goodbye " + text + "\"";
        }
    };
});

var service2module = angular.module('module2', []);

service2module.factory('myService', function() {
    return {
        sayHello: function(text) {
            return "Service2 says \"Hello " + text + "\"";
        },
        sayGoodbye: function(text) {
            return "Service2 says \"Goodbye " + text + "\"";
        }
    };
});

function HelloCtrl($scope, myService) {
    $scope.fromService1 = myService.sayHello("World");
}

function GoodbyeCtrl($scope, myService) {
    $scope.fromService2 = myService.sayGoodbye("World");
}​

मेरे पास 2 मॉड्यूल (मॉड्यूल 1 और मॉड्यूल 2) हैं। मॉड्यूल 1 और मॉड्यूल 2 दोनों एक सेवा को परिभाषित करते हैं जिसे myService कहा जाता है। जब दोनों मॉड्यूल myApp में आयात किए जाते हैं तो यह Angular के भीतर myService पर एक नाम का टकराव पैदा करता है। ऐसा प्रतीत होता है कि AngularJs आपको संभावित मुद्दे की चेतावनी दिए बिना दूसरी सेवा परिभाषा का उपयोग करता है।

बहुत बड़ी परियोजनाओं (या बस सामान्य रूप से मॉड्यूल का पुन: उपयोग) से नाम कटने का जोखिम होगा, जिसे डिबग करना मुश्किल हो सकता है।

क्या मॉड्यूल नाम के साथ नामों को उपसर्ग करने का एक तरीका है ताकि नाम क्लैश न हो?


आप अपने मॉड्यूल को नाम देने के लिए एक सम्मेलन का उपयोग करके इस स्थिति से बच सकते हैं ताकि वे हमेशा अद्वितीय रहें।

एक दृष्टिकोण यह देखना है कि अन्य भाषाएं कैसे करती हैं। उदाहरण के लिए जावा में कक्षा का "पूरा नाम" उस फ़ाइल और फ़ोल्डर के नाम पर आधारित है, जिसमें उदाहरण के लिए यदि आपके पास फ़ोल्डर MyArtStuff में बिटमैप.जवा नामक एक जावा फ़ाइल है, तो कक्षा का पूरा नाम। MyArtStuff.Bitmap हो

AngularJS आपके मॉड्यूल नाम के भाग के रूप में आपको डॉट्स (।) की अनुमति देता है ताकि आप अनिवार्य रूप से नाम सम्मेलन का उपयोग कर सकें।

उदाहरण के लिए, यदि कोई डेवलपर "ModuleA" नामक मॉड्यूल को "MainPage \ Module1.js" स्क्रिप्ट में बनाता है, तो उन्हें अपने मॉड्यूल का नाम "MainPage.Module1.ModuleA" रखना चाहिए। क्योंकि प्रत्येक पथ और फ़ाइल नाम आपके ऐप में अद्वितीय है तो आपका मॉड्यूल नाम अद्वितीय होगा।

इस सम्मेलन का पालन करने के लिए आपको बस अपने डेवलपर्स को प्राप्त करना होगा।

रॉकलाइट के रूप में ध्यान दें कि यह कई मॉड्यूल में समान नाम वाले सेवाओं, नियंत्रकों आदि के साथ मदद नहीं करेगा। लेकिन आप उन तत्वों के नाम और उपसर्ग का परिणाम के रूप में अच्छी तरह से उपयोग कर सकते हैं।

आदर्श रूप से एंगुलरजेएस के नाम स्थान और भविष्य में होंगे। तब तक सबसे अच्छा हम यह कर सकते हैं कि डेवलपर्स क्या 40 से अधिक वर्षों के लिए कर रहे हैं इससे पहले कि नाम स्थान का आविष्कार किया गया था और हमारे तत्वों को सबसे अच्छा उपसर्ग कर सकें।


आप जिस सेवा से होना चाहते हैं उस मॉड्यूल पर अपने नियंत्रकों को परिभाषित करें।

service2Module.controller("ServiceTwoCtrl", function(myService, $scope) {});


आज तक, एंगुलरजेएस मॉड्यूल किसी भी प्रकार के नाम स्थान प्रदान नहीं करते हैं जो विभिन्न मॉड्यूल में वस्तुओं के बीच टकराव को रोकते हैं। कारण यह है कि एक AngularJS ऐप में एक एकल इंजेक्टर है जो मॉड्यूल नामों के संबंध में सभी वस्तुओं के नाम रखता है।

AngularJS डेवलपर गाइड का कहना है:

निर्भरता निर्माण की जिम्मेदारी का प्रबंधन करने के लिए, प्रत्येक कोणीय आवेदन में एक इंजेक्टर होता है। इंजेक्टर एक सेवा लोकेटर है जो निर्माण और निर्भरता की तलाश के लिए जिम्मेदार है।

जैसा कि आपने उल्लेख किया है, जब आपके मुख्य / ऐप मॉड्यूल में मॉड्यूल इंजेक्ट करते समय गंदा कीड़े हो सकते हैं। जब टकराव होता है तो वे चुप हो जाते हैं और विजेता अंतिम मॉड्यूल जिसे इंजेक्ट किया जाता है, द्वारा निर्धारित किया जाता है।

तो नहीं, इन टकरावों से बचने के लिए कोई अंतर्निहित तरीका नहीं है। शायद भविष्य में ऐसा ही होगा। बड़े एप्लिकेशन के लिए जहां यह समस्या अधिक संभावना बन जाती है, आप सही हैं कि नामकरण परंपराएं आपका सबसे अच्छा उपकरण हैं। विचार करें कि क्या मॉड्यूल या फ़ंक्शन क्षेत्र से संबंधित ऑब्जेक्ट एक छोटे उपसर्ग का उपयोग कर सकते हैं।





angularjs-module