यदि आपका इरादा किसी अन्य घटक के पहले से ही तत्काल नियंत्रक को पकड़ना है और यदि आप घटक / निर्देश आधारित दृष्टिकोण का पालन कर रहे हैं, तो आप हमेशा कर सकते हैं 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 i.e
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>
कई तरीके हैं जिनसे आपको आवश्यकता हो सकती है ।
(कोई उपसर्ग नहीं) - वर्तमान तत्व पर आवश्यक नियंत्रक का पता लगाएँ। नहीं मिलने पर त्रुटि फेंको।
? - आवश्यक नियंत्रक का पता लगाने का प्रयास करें या यदि नहीं मिला तो लिंक fn के लिए नल पास करें।
^ - तत्व और उसके माता-पिता की खोज करके आवश्यक नियंत्रक का पता लगाएं। नहीं मिलने पर त्रुटि फेंको।
^ ^ - तत्व के माता-पिता की खोज करके आवश्यक नियंत्रक का पता लगाएं। नहीं मिलने पर त्रुटि फेंको।
^? - तत्व और उसके माता-पिता को खोजकर आवश्यक नियंत्रक का पता लगाने का प्रयास करें या नहीं पाए जाने पर लिंक fn को पास करें।
^ ^ - तत्व के माता-पिता को खोजकर आवश्यक नियंत्रक का पता लगाने का प्रयास करें, या नहीं पाए जाने पर लिंक fn के लिए शून्य पास करें।
पुराना उत्तर:
आपको $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
आपका विचार मॉडल है, और दूसरे मामले में यह नियंत्रक का उदाहरण है।
TestCtrl1
इसके बजाय एक सेवा में बदलना चाहिए ।