2015-06-03 21 views
8

मेरे पास एक 'नियंत्रक' नियंत्रक के रूप में एक नियंत्रक है, यह ng-controller विशेषता के साथ घोषित किया गया है, फिर कुछ अन्य नियंत्रक जो गतिशील रूप से तत्काल गतिशील होते हैं $routeProvider। मैं एक ऐसा फ़ंक्शन घोषित करना चाहता हूं जो किसी भी गतिशील/बाल नियंत्रकों के दायरे में ng-click विशेषता के माध्यम से उपलब्ध होगा।'रूट' नियंत्रक से 'वर्तमान' दायरे तक पहुंचें

मैं अपने रूट नियंत्रक पर फ़ंक्शन घोषित कर सकता हूं, उदा।

$scope.announce = function() { 
    alert($scope.specificName); 
} 

तो मैं यह सब 'बच्चे' नियंत्रकों के लिए स्कोप के सभी पर देखते हैं, लेकिन $scope इस समारोह में इस्तेमाल जड़ नियंत्रक, नहीं वर्तमान में सक्रिय गुंजाइश/नियंत्रक करने के लिए स्थानीय है। मैं इस फ़ंक्शन में सक्रिय, बाल दायरे तक कैसे पहुंच सकता हूं?

अपने "रूट" नियंत्रक में:

$scope.announce = function (childScope) { 
    alert(childScope.specificName); 
}; 

अपने "बच्चा" नियंत्रक में:

+0

क्या आप अपने फ़ंक्शन का कुछ उपयोग केस जोड़ सकते हैं? (क्या आप इसे किसी अन्य फ़ंक्शन के अंदर ng-click के साथ उपयोग कर रहे हैं?) ... – Okazari

+1

आप हमेशा नियंत्रकों के बीच संवाद करने के लिए कारखानों और ईवेंट एमिटर का उपयोग कर सकते हैं। मेरे पास एक मेनू नियंत्रक के साथ एक समान चीज है जो कुछ लॉग इन या आउट होने पर हर बार अद्यतन हो जाती है, या शॉपिंग टोकरी में कुछ जोड़ती है .... मुझे नहीं पता कि यह एक ही पंक्ति के साथ है या नहीं? –

उत्तर

3

तुम बस पैरामीटर के रूप में बच्चे के दायरे पारित कर सकते हैं

$scope.announce($scope); 

या आप के बाद से, ng-click:
से फ़ंक्शन को कॉल करने की आवश्यकता है अपने "बच्चे" नियंत्रक में:

$scope.callAnnounce = function(){ 
    $scope.announce($scope) 
}; 

यहां लाभ यह है कि आपके बच्चे नियंत्रकों में एक ही कोड हो सकता है, और केवल आपके रूट नियंत्रक में फ़ंक्शन को संशोधित करना होगा, आपको कार्यक्षमता को संपादित करना होगा।

+0

इसका मतलब है कि मुझे एक ऐसा फ़ंक्शन घोषित करना है जो प्रत्येक बच्चे नियंत्रक में 'घोषणा' कहता है, जिसे मैं टालना पसंद करूंगा, लेकिन अगर मुझे करना है तो यह ट्रेन की तोड़ नहीं है। – ProfK

+1

एह, नहीं, आप नहीं करते हैं। आप जड़ नियंत्रक में घोषणा समारोह घोषित कर सकते हैं। इसके बाद आप इसे अपने बच्चे नियंत्रकों में आसानी से उपयोग कर सकते हैं – Cerbrus

+0

मैं 'ng-click' फ़ंक्शन से 'घोषणा' को कॉल करना चाहता हूं, और मुझे लगता है कि फ़ंक्शन को 'घोषणा' करने के लिए' $ scope' पास करना होगा, और ऐसा लगता है उस समारोह को प्रत्येक नियंत्रक में मौजूद होना होगा। – ProfK

5

मुझे इस plunker में कुछ काम मिल गया है जो कुछ उपयोगकेस को कवर करता है।

फ़ंक्शन एक पैरामीटर लेगा। इस पैरामीटर में प्रत्येक दायरे में एक ही नाम होगा।

<body ng-app="MyApp"> 
    <div ng-controller="mainCtrl"> 
    <button ng-click="announce(specificName)">announce in main</button> 
    <div ng-controller="subCtrl"> 
     <button ng-click="announce(specificName)">announce in sub</button> 
    </div> 
    </div> 
</body> 

आपको लगता है कि जैसे मुख्य नियंत्रक देखो:

angular.module('MyApp').controller('mainCtrl', function($scope, ItemService){ 

    $scope.specificName = "I'm main !"; 
    $scope.announce = function(specificName){ 
     alert(specificName); 
    } 

}); 

और बस उप नियंत्रक में "specificName" var ओवरराइड:

angular.module('MyApp').controller('subCtrl', function($scope, ItemService){ 

    $scope.specificName = "I'm a sub !"; 

}); 

शुद्ध जे एस में समारोह कॉल करने के लिए आप कर सकते हैं प्रत्येक नियंत्रक में यह करें:

$scope.announce($scope.specificName); 

संपादित करें:

मुझे अभी एहसास हुआ कि एक अन्य समाधान है जो आपकी ज़रूरत को पूरा कर सकता है। आप फ़ंक्शन साझा करने के लिए फ़ैक्टरी या सेवा का उपयोग कर सकते हैं।

कैसे सेवा दे सकता है:

myApp.service("AnnounceService", 
    function(){ 
     var service = {}; 

     service.announce = function(toAnnounce){ 
       alert(toAnnounce); 
     } 

     return service; 
    } 
); 

कैसे अपने नियंत्रक तरह दिखेगा:

angular.module('MyApp').controller('subCtrl', function($scope, AnnounceService){ 

    $scope.announce = AnnounceService.announce; 
    $scope.specificName = "I'm a sub !"; 

    //Equivalent 
    $scope.announce($scope.specificName); 
    AnnounceService.announce($scope.specificName); 

}); 

यह एक ही बात के रूप में आप प्रत्येक नियंत्रक में specificName घोषित करने और करने के लिए इसे पारित करने की जरूरत है कार्यक्रम। लेकिन समारोह आपके आवेदन के किसी भी हिस्से में प्रयोग योग्य होगा।

अंत नहीं समारोह में सार भाग लेकिन प्रत्येक नियंत्रक में अपने वर का नाम: तुम बस सेवा और

विवरण इंजेक्षन की जरूरत है। पारंपरिक नामकरण का एक प्रकार।

यदि यह var राज्य संबंधित है तो आप इसे राज्य परिभाषा में जोड़ सकते हैं। (यदि ऐसा है तो मैं आपको एक उदाहरण देने का प्रयास कर सकता हूं।)

मैं भी किसी अन्य को एक पूर्ण $ दायरा देने की सलाह नहीं देता हूं। यह कोणीय में एक अच्छा अभ्यास नहीं है।

इस समस्या को हल करने की उम्मीद है, या पर्याप्त सुराग दें।

अधिक विशिष्ट चीज़ पूछने के लिए स्वतंत्र महसूस करें, मैं इसे आपकी आवश्यकताओं के अनुरूप अनुकूलित करने के लिए उत्तर संपादित करूंगा।

+1

कुछ बहुत उपयोगी उत्तर के लिए धन्यवाद हो सकता है, लेकिन सेर्ब्रस ने मेरी समस्या को पहले हल किया था। – ProfK

+1

@ProfK True, लेकिन यह ध्यान रखें कि आपने किसी फ़ंक्शन में पूर्ण दायरा नहीं दिया है। यह एक अच्छा अभ्यास नहीं है। – Okazari

संबंधित मुद्दे