दिलचस्प पोस्ट
हेडर गार्ड का उद्देश्य रेलवे 4 के साथ, मॉडल। स्कॉड हटाया गया है, लेकिन मॉडल। सभी इसे बदल नहीं सकते हैं एक वैध सीएसएस के साथ आईई 7 और आईई 8 कैसे लक्षित करता है? कैसे परिवर्तित / d3.js ग्राफ को पीडीएफ / जेपीईजी को बचाने के लिए न्यूनतम 6 अक्षर, कम से कम एक अक्षर और एक नंबर के साथ पासवर्ड रीगेक्स और इसमें विशेष वर्ण हो सकते हैं कैसे एक ऐप में एकाधिक विजेट जोड़ने के लिए? एस 3 में डेटा कैसे स्टोर करें और रेल एपीआई / आईओएस ग्राहक के साथ एक सुरक्षित तरीके से उपयोगकर्ता पहुंच की अनुमति दें? Linux में pthread_create के लिए अनिर्धारित संदर्भ "जावा हीप स्पेस" और "मेमोरी आउट आउट" प्राप्त करते समय ग्रहण स्मृति सेटिंग्स मैं कैसे गतिशील रूप से एक परीक्षण सूट JUnit 4 बना सकता हूँ? शिफ्ट ऑपरेटर (<<, >>) क्या सी में गणित या तार्किक हैं? एपाचे और mod_wsgi के साथ कई डीजाएं साइटें SQL सर्वर में चलने की कुल गणना करें पायथन में निर्देशिकाओं को घुमावने के लिए os.walk () का प्रयोग करना सेगमेंटेशन फॉल्ट्स के लिए सामान्य कारणों की निश्चित सूची

मैं AngularJS में एक नियंत्रक को एक दूसरे नियंत्रक में कैसे इंजेक्ट कर सकता हूं

मैं कांगारू के लिए नया हूँ और यह समझने की कोशिश कर रहा हूं कि कैसे काम करें …

AngularJS का उपयोग करना, मैं एक नियंत्रक को दूसरे नियंत्रक के भीतर इस्तेमाल करने के लिए कैसे इंजेक्ट कर सकता / सकती हूं?

मेरे पास निम्न स्निपेट है:

var app = angular.module("testApp", ['']); app.controller('TestCtrl1', ['$scope', function ($scope) { $scope.myMethod = function () { console.log("TestCtrl1 - myMethod"); } }]); app.controller('TestCtrl2', ['$scope', 'TestCtrl1', function ($scope, TestCtrl1) { TestCtrl1.myMethod(); }]); 

जब मैं इसे निष्पादित करता हूं, तो मुझे त्रुटि मिलती है:

 Error: [$injector:unpr] Unknown provider: TestCtrl1Provider <- TestCtrl1 http://errors.angularjs.org/1.2.21/$injector/unpr?p0=TestCtrl1Provider%20%3C-%20TestCtrl1 

क्या मैं एक नियंत्रक के अंदर किसी नियंत्रक के अंदर भी उपयोग करने की कोशिश कर रहा हूं, या मुझे यह सेवा करना चाहिए?

वेब के समाधान से एकत्रित समाधान "मैं AngularJS में एक नियंत्रक को एक दूसरे नियंत्रक में कैसे इंजेक्ट कर सकता हूं"

यदि आपका इरादा दूसरे घटक के पहले से ही तत्काल नियंत्रक को पकड़ना है और यदि आप घटक / निर्देश आधारित आधारित तत्वों का पालन कर रहे हैं तो आपको किसी अन्य घटकों से एक नियंत्रक (एक घटक का उदाहरण) की require हो सकती है जो कि निश्चित पदानुक्रम

उदाहरण के लिए:

 //some container component that provides a wizard and transcludes the page components displayed in a wizard myModule.component('wizardContainer', { ..., controller : function WizardController() { this.disableNext = function() { //disable next step... some implementation to disable the next button hosted by the wizard } }, ... }); //some child component myModule.component('onboardingStep', { ..., controller : function OnboadingStepController(){ this.$onInit = function() { //.... you can access this.container.disableNext() function } this.onChange = function(val) { //..say some value has been changed and it is not valid i do not want wizard to enable next button so i call container's disable method ie if(notIsValid(val)){ this.container.disableNext(); } } }, ..., require : { container: '^^wizardContainer' //Require a wizard component's controller which exist in its parent hierarchy. }, ... }); 

अब इन उपरोक्त घटकों का उपयोग कुछ ऐसा हो सकता है:

 <wizard-container ....> <!--some stuff--> ... <!-- some where there is this page that displays initial step via child component --> <on-boarding-step ...> <!--- some stuff--> </on-boarding-step> ... <!--some stuff--> </wizard-container> 

कई तरीके हैं जिन्हें आप सेट अप कर सकते हैं।

(कोई उपसर्ग नहीं) – वर्तमान तत्व पर आवश्यक नियंत्रक खोजें। एक त्रुटि फेंक अगर नहीं मिला।

? – अपेक्षित नियंत्रक का पता लगाने का प्रयास करें या लिंक नं। को नल दें यदि नहीं मिला।

^ – तत्व और इसके माता-पिता को खोजकर आवश्यक नियंत्रक का पता लगाएं। एक त्रुटि फेंक अगर नहीं मिला।

^^ – तत्व के माता-पिता को खोजकर आवश्यक नियंत्रक का पता लगाएं। एक त्रुटि फेंक अगर नहीं मिला।

? ^ – तत्व और उसके माता-पिता की खोज करके आवश्यक निर्देशक का पता लगाने का प्रयास करें या यदि नहीं मिला तो लिंक एफएन को पास करें।

? ^ ^ – तत्व के अभिभावकों को खोजकर आवश्यक नियंत्रक का पता लगाने का प्रयास करें, या यदि नहीं मिला तो लिंक एफएन के पास नल दें।



पुराने उत्तर:

किसी नियंत्रक के अंदर एक नियंत्रक को इन्स्तांत करने के लिए आपको $controller सेवा को इंजेक्ट करना होगा। लेकिन इस बात से अवगत रहें कि इससे कुछ डिज़ाइन समस्याएं हो सकती हैं। आप हमेशा पुन: प्रयोज्य सेवाएं बना सकते हैं, जो एक उत्तरदायित्व के बाद होती हैं और उन्हें आपको नियंत्रकों में डालकर आवश्यकता पड़ती है।

उदाहरण:

 app.controller('TestCtrl2', ['$scope', '$controller', function ($scope, $controller) { var testCtrl1ViewModel = $scope.$new(); //You need to supply a scope while instantiating. //Provide the scope, you can also do $scope.$new(true) in order to create an isolated scope. //In this case it is the child scope of this scope. $controller('TestCtrl1',{$scope : testCtrl1ViewModel }); testCtrl1ViewModel.myMethod(); //And call the method on the newScope. }]); 

किसी भी मामले में आप TestCtrl1.myMethod() कॉल नहीं कर सकते क्योंकि आपने $scope पर विधि संलग्न की है और नियंत्रक उदाहरण पर नहीं।

यदि आप नियंत्रक साझा कर रहे हैं, तो यह हमेशा बेहतर होगा: –

 .controller('TestCtrl1', ['$log', function ($log) { this.myMethod = function () { $log.debug("TestCtrl1 - myMethod"); } }]); 

और उपभोक्ता करते समय:

 .controller('TestCtrl2', ['$scope', '$controller', function ($scope, $controller) { var testCtrl1ViewModel = $controller('TestCtrl1'); testCtrl1ViewModel.myMethod(); }]); 

पहले मामले में वास्तव में $scope आपके विचार मॉडल है, और दूसरे मामले में यह नियंत्रक उदाहरण स्वयं।

मैंने सुझाव दिया था कि आपको जो प्रश्न पूछना चाहिए वह है कि नियंत्रकों में सेवाओं को कैसे पेश किया जाए पतली नियंत्रकों के साथ मोटी सेवाएं अंगूठे का एक अच्छा नियम है, उर्फ ​​बस अपने विचारों में अपनी सेवा / फैक्ट्री (व्यापार तर्क के साथ) को गोंद करने के लिए नियंत्रकों का उपयोग करें।

नियंत्रकों को रूट परिवर्तनों पर कचरा एकत्रित किया जाता है, उदाहरण के लिए, यदि आप व्यापारिक तर्क रखने के लिए नियंत्रकों का उपयोग करते हैं, जो एक मूल्य प्रदान करता है, तो दो पृष्ठ पर स्थिति खोने जा रहे हैं, यदि ऐप उपयोगकर्ता ब्राउजर बैक बटन पर क्लिक करता है

 var app = angular.module("testApp", ['']); app.factory('methodFactory', function () { return { myMethod: function () { console.log("methodFactory - myMethod"); }; }; app.controller('TestCtrl1', ['$scope', 'methodFactory', function ($scope,methodFactory) { //Comma was missing here.Now it is corrected. $scope.mymethod1 = methodFactory.myMethod(); }]); app.controller('TestCtrl2', ['$scope', 'methodFactory', function ($scope, methodFactory) { $scope.mymethod2 = methodFactory.myMethod(); }]); 

यहाँ दो नियंत्रकों में इंजेक्ट किए गए फैक्ट्री का एक कामकाज डेमो है

इसके अलावा, मैं सुझाव देता हूं कि सेवाओं / कारखानों पर इस ट्यूटोरियल को पढ़ना।

जेएस में अपने नियंत्रक को आयात / इंजेक्ट करने की कोई जरूरत नहीं है। आप अपने एचटीएमएल द्वारा अपने नियंत्रक / नेस्टेड नियंत्रक को इंजेक्ट कर सकते हैं। यह मेरे लिए काम किया है पसंद :

 <div ng-controller="TestCtrl1"> <div ng-controller="TestCtrl2"> <!-- your code--> </div> </div> 
 <div ng-controller="TestCtrl1"> <div ng-controller="TestCtrl2"> <!-- your code--> </div> </div> 

यह मेरे मामले में सबसे अच्छा काम करता है, जहां TestCtrl2 के पास इसके निर्देश हैं।

 var testCtrl2 = $controller('TestCtrl2') 

यह मुझे एक त्रुटि बताता है कि scopeProvider इंजेक्शन त्रुटि

  var testCtrl1ViewModel = $scope.$new(); $controller('TestCtrl1',{$scope : testCtrl1ViewModel }); testCtrl1ViewModel.myMethod(); 

यह वास्तव में काम नहीं करता है अगर आपके पास 'टेस्टसीकंट 1' में निर्देश हैं, तो यहां पर बनाए गए इस निर्देश से वास्तव में एक अलग गुंजाइश है। आप 'TestCtrl1' के दो उदाहरणों के साथ समाप्त होते हैं

सबसे अच्छा समाधान:-

 angular.module("myapp").controller("frstCtrl",function($scope){$scope.name="Atul Singh";}).controller("secondCtrl",function($scope){angular.extend(this, $controller('frstCtrl', {$scope:$scope}));console.log($scope);}) 

// यहां आपको इसे निष्पादित किए बिना पहला नियंत्रक कॉल मिला है

आप इस तरह दूसरे नियंत्रक से 1 नियंत्रक की फ़ंक्शन / विधि कॉल करने के लिए $rootScope का भी उपयोग कर सकते हैं,

 .controller('ctrl1', function($rootScope, $scope) { $rootScope.methodOf2ndCtrl(); //Your code here. }) .controller('ctrl2', function($rootScope, $scope) { $rootScope.methodOf2ndCtrl = function() { //Your code here. } }) 

अपने कोडिंग के लिए टाइपस्क्रिप्ट का उपयोग करें, क्योंकि यह ऑब्जेक्ट ओरिएंटेड है, कड़ाई से टाइप किया गया और कोड को बनाए रखने में आसान …

typescipt के बारे में अधिक जानकारी के लिए यहां क्लिक करें

यहाँ एक सरल उदाहरण मैंने दो नियंत्रक के बीच डाटास्क्रिप्ट का उपयोग करके डेटा साझा करने के लिए बनाया है …

 module Demo { //create only one module for single Applicaiton angular.module('app', []); //Create a searvie to share the data export class CommonService { sharedData: any; constructor() { this.sharedData = "send this data to Controller"; } } //add Service to module app angular.module('app').service('CommonService', CommonService); //Create One controller for one purpose export class FirstController { dataInCtrl1: any; //Don't forget to inject service to access data from service static $inject = ['CommonService'] constructor(private commonService: CommonService) { } public getDataFromService() { this.dataInCtrl1 = this.commonService.sharedData; } } //add controller to module app angular.module('app').controller('FirstController', FirstController); export class SecondController { dataInCtrl2: any; static $inject = ['CommonService'] constructor(private commonService: CommonService) { } public getDataFromService() { this.dataInCtrl2 = this.commonService.sharedData; } } angular.module('app').controller('SecondController', SecondController); 

}