एक कोणीय निर्देश में नियंत्रक की आवश्यकता कैसे होती है


86

क्या कोई मुझे बता सकता है कि एक कोन को दूसरे कोणीयजेएस के निर्देश में एक नियंत्रक से कैसे शामिल किया जाए। उदाहरण के लिए मेरे पास निम्नलिखित कोड है

var app = angular.module('shop', []).
config(['$routeProvider', function ($routeProvider) {
    $routeProvider.when('/', {
        templateUrl: '/js/partials/home.html'
    })
        .when('/products', {
        controller: 'ProductsController',
        templateUrl: '/js/partials/products.html'
    })
        .when('/products/:productId', {
        controller: 'ProductController',
        templateUrl: '/js/partials/product.html'
    });
}]);

app.directive('mainCtrl', function () {
    return {
        controller: function ($scope) {}
    };
});

app.directive('addProduct', function () {
    return {
        restrict: 'C',
        require: '^mainCtrl',
        link: function (scope, lElement, attrs, mainCtrl) {
            //console.log(cartController);
        }
    };
});

सभी खाते के द्वारा मुझे addProduct निर्देश में नियंत्रक तक पहुंचने में सक्षम होना चाहिए, लेकिन मैं नहीं हूं। क्या ऐसा करने का कोई बेहतर तरीका है?


5
requireएक और निर्देश की उपस्थिति सुनिश्चित करता है और फिर इसके नियंत्रक को शामिल करता है। ^requireवर्तमान तत्व के अतिरिक्त वर्तमान एक के ऊपर तत्वों की जाँच करता है। इसलिए आपको काम करने के लिए दोनों निर्देशों का एक साथ उपयोग करना होगा। अन्यथा, बस एक नियंत्रक को परिभाषित करें app.controllerऔर फिर दोनों निर्देशों में इसका उपयोग करें। किसी भी तरह से, आप इसे अपने HTML कोड के साथ एक साधारण प्लंकर में डाल सकते हैं?
जोश डेविड मिलर

जवाबों:


187

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


यह उस पर निर्भर करता है कि आप किसी नियंत्रक को साझा करके क्या हासिल करना चाहते हैं; आप या तो एक ही नियंत्रक साझा कर सकते हैं (हालांकि अलग-अलग उदाहरण हैं), या आप एक ही नियंत्रक उदाहरण साझा कर सकते हैं।

एक नियंत्रक साझा करें

दो निर्देश एक ही नियंत्रक को दो निर्देशों के लिए एक ही विधि से पारित कर सकते हैं, जैसे:

app.controller( 'MyCtrl', function ( $scope ) {
  // do stuff...
});

app.directive( 'directiveOne', function () {
  return {
    controller: 'MyCtrl'
  };
});

app.directive( 'directiveTwo', function () {
  return {
    controller: 'MyCtrl'
  };
});

प्रत्येक निर्देश को नियंत्रक का अपना उदाहरण मिलेगा, लेकिन इससे आप जितना चाहें उतने घटकों के बीच तर्क साझा कर सकते हैं।

एक नियंत्रक की आवश्यकता है

यदि आप नियंत्रक के एक ही उदाहरण को साझा करना चाहते हैं , तो आप उपयोग करते हैं require

requireएक अन्य निर्देश की उपस्थिति सुनिश्चित करता है और फिर इसके नियंत्रक को लिंक फ़ंक्शन के पैरामीटर के रूप में शामिल करता है। इसलिए यदि आपके पास एक तत्व पर दो निर्देश हैं, तो आपके निर्देश को अन्य निर्देश की उपस्थिति और इसके नियंत्रक तरीकों तक पहुंच की आवश्यकता हो सकती है । इसके लिए एक सामान्य उपयोग का मामला है ngModel

^require, कैरट के अतिरिक्त के साथ, अन्य तत्व को खोजने के लिए वर्तमान तत्व के अतिरिक्त निर्देश के ऊपर के तत्वों की जांच करता है। यह आपको जटिल घटक बनाने की अनुमति देता है जहां "उप-घटक" अपने नियंत्रक के माध्यम से मूल घटक के साथ संचार कर सकते हैं। उदाहरणों में टैब शामिल हो सकते हैं, जहां प्रत्येक फलक स्विचिंग को संभालने के लिए समग्र टैब के साथ संचार कर सकता है; एक अकॉर्डियन सेट यह सुनिश्चित कर सकता है कि एक समय में केवल एक ही खुला हो; आदि।

किसी भी घटना में, आपको काम करने के लिए दो निर्देशों का एक साथ उपयोग करना होगा। requireघटकों के बीच संवाद स्थापित करने का एक तरीका है।

अधिक जानकारी के लिए निर्देशों के मार्गदर्शक पृष्ठ देखें: http://docs.angularjs.org/guide/directive


4
क्या एक साहसी निर्देशक नियंत्रक की आवश्यकता है? मूल रूप से मुझे भाई के निर्देशों के बीच एक नियंत्रक या सेवा के एक ही उदाहरण को साझा करने की आवश्यकता है (जैसा कि डोम भाई-बहनों में, उसी DOM तत्व पर नहीं) जो एनजी-रिपीट का उपयोग करके दोहराया जाता है। कल्पना करें कि प्रत्येक दोहराया आइटम में एक निर्देश है जो उनके बीच एक साझा राज्य या तर्क की आवश्यकता है।
CMCDragonkai

2
@CMCDragonkai ऐसा करने का कोई तरीका नहीं है, लेकिन एक ही चीज़ को पूरा करने के दो सामान्य तरीके हैं। पहला यह है कि अगर भाई-बहन सभी एक ही "प्रकार" के हैं, तो ngRepeat के ऊपर का तत्व एक कंटेनर निर्देशन की तरह हो सकता है और सभी उप-तत्वों को फिर उस निर्देश की आवश्यकता हो सकती है, सभी एक ही नियंत्रक को साझा करते हैं। अधिक सामान्य समाधान - और अक्सर अधिक विहित - एक साझा सेवा का उपयोग करना है। क्या आप विस्तार से बता सकते हैं कि इन भाई-बहनों को क्या करना है और उन्हें क्या साझा करना है?
जोश डेविड मिलर

पहला विकल्प करते ही हां खत्म हो गया। कंटेनर निर्देशक नियंत्रक का उपयोग करना। बहुत अच्छा काम करता है। यह चिनाई के लिए है।
CMCDragonkai

यह एक शानदार उत्तर है और इसने मेरी समझ को मजबूत किया है कि यह कैसे काम करता है। धन्यवाद! (एक नोट के रूप में, यह एक नई विशेषता हो सकती है, लेकिन आप requireकिसी एकल निर्देश, या निर्देशों की एक सरणी निर्दिष्ट करने के लिए उपयोग कर सकते हैं ; प्रत्येक निर्देश को ^अधिक दानेदार आवश्यकताओं के लिए एक कैरेट ( ) के साथ उपसर्ग किया जा सकता है ।)
jedd .ahyoung

दो निर्देशों में समान नियंत्रक का उपयोग करना प्रत्येक निर्देश को अपना उदाहरण नहीं देता है।
jsbisht

27

मार्क राजकोक द्वारा यहाँ एक अच्छा स्टैकओवरफ़्लो उत्तर दिया गया है:

पैरेंट डायरेक्टर कंट्रोलर्स को एंगुलरजेएस डाइरेक्टिव कंट्रोलर की आवश्यकता होती है?

इस बहुत स्पष्ट jsField के लिंक के साथ: http://jsfiddle.net/mrajcok/StXFK/

<div ng-controller="MyCtrl">
    <div screen>
        <div component>
            <div widget>
                <button ng-click="widgetIt()">Woo Hoo</button>
            </div>
        </div>
    </div>
</div>

जावास्क्रिप्ट

var myApp = angular.module('myApp',[])

.directive('screen', function() {
    return {
        scope: true,
        controller: function() {
            this.doSomethingScreeny = function() {
                alert("screeny!");
            }
        }
    }
})

.directive('component', function() {
    return {
        scope: true,
        require: '^screen',
        controller: function($scope) {
            this.componentFunction = function() {
                $scope.screenCtrl.doSomethingScreeny();
            }
        },
        link: function(scope, element, attrs, screenCtrl) {
            scope.screenCtrl = screenCtrl
        }
    }
})

.directive('widget', function() {
    return {
        scope: true,
        require: "^component",
        link: function(scope, element, attrs, componentCtrl) {
            scope.widgetIt = function() {
                componentCtrl.componentFunction();
            };
        }
    }
})


//myApp.directive('myDirective', function() {});
//myApp.factory('myService', function() {});

function MyCtrl($scope) {
    $scope.name = 'Superhero';
}

4
मेरे लिए, मार्क राजकोक का उदाहरण किसने बनाया था, इस बात पर सबसे अधिक ध्यान दिया गया था कि नियंत्रक विधियों का निर्माण कैसे किया जाता है। आमतौर पर आप $ गुंजाइशों के माध्यम से बनाए गए नियंत्रक विधियों को देखते हैं। $.m.mododName = function () {...}, लेकिन इसके लिए काम करने के लिए, आपको उन तरीकों के लिए इस.methodName का उपयोग करना चाहिए, जो आप चाहते हैं। मैंने पहली बार में यह नहीं देखा।
coblr
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.