एंगुलरजेएस में * स्वयं के दायरे के साथ एक कस्टम निर्देश * के भीतर से पेरेंट स्कोप कैसे एक्सेस करें?


327

मैं एक निर्देश के भीतर "माता-पिता" दायरे तक पहुंचने के किसी भी तरीके की तलाश कर रहा हूं। किसी भी प्रकार के दायरे, ट्रांसक्लूड, आवश्यकता, ऊपर से चर (या गुंजाइश खुद), आदि में मैं पूरी तरह से पीछे की तरफ झुकने के लिए तैयार हूं, लेकिन मैं कुछ पूरी तरह से हैक या अप्राप्य से बचना चाहता हूं। उदाहरण के लिए, मुझे पता है कि मैं इसे अभी कर सकता हूं $scopeऔर प्रीलिंक मापदंडों से ले $siblingकर वैचारिक "माता-पिता" को खोजने के लिए इसे ढलान पर पुनरावृत्त कर रहा हूं ।

जो मैं वास्तव में चाहता हूं $watch, वह अभिभावक के दायरे में अभिव्यक्ति के लिए सक्षम होना है। अगर मैं ऐसा कर सकता हूं, तो मैं यह पूरा कर सकता हूं कि मैं यहां क्या करने की कोशिश कर रहा हूं: AngularJS - चर के साथ एक आंशिक रेंडर कैसे करें?

एक महत्वपूर्ण बात यह है कि निर्देश को उसी मूल दायरे के भीतर पुन: प्रयोग करने योग्य होना चाहिए। इसलिए डिफ़ॉल्ट व्यवहार (गुंजाइश: गलत) मेरे लिए काम नहीं करता है। मुझे निर्देश के अनुसार व्यक्तिगत दायरे की आवश्यकता है, और फिर मुझे $watchएक चर की आवश्यकता है जो मूल दायरे में रहता है।

एक कोड नमूना 1000 शब्दों का मूल्य है, इसलिए:

app.directive('watchingMyParentScope', function() {
    return {
        require: /* ? */,
        scope: /* ? */,
        transclude: /* ? */,
        controller: /* ? */,
        compile: function(el,attr,trans) {
            // Can I get the $parent from the transclusion function somehow?
            return {
                pre: function($s, $e, $a, parentControl) {
                    // Can I get the $parent from the parent controller?
                    // By setting this.$scope = $scope from within that controller?

                    // Can I get the $parent from the current $scope?

                    // Can I pass the $parent scope in as an attribute and define
                    // it as part of this directive's scope definition?

                    // What don't I understand about how directives work and
                    // how their scope is related to their parent?
                },
                post: function($s, $e, $a, parentControl) {
                    // Has my situation improved by the time the postLink is called?
                }
            }
        }
    };
});

जवाबों:


644

देखें कि AngularJS में स्कोप प्रोटोटाइप / प्रोटोटाइप इनहेरिटेंस की बारीकियां क्या हैं?

सारांशित करने के लिए: जिस तरह से एक निर्देश अपने अभिभावक ( $parent) दायरे तक पहुँचता है, वह दायरा उस प्रकार पर निर्भर करता है जो निर्देश बनाता है:

  1. डिफ़ॉल्ट ( scope: false) - निर्देश एक नया क्षेत्र नहीं बनाता है, इसलिए यहां कोई विरासत नहीं है। निर्देशक का दायरा माता-पिता / कंटेनर के समान ही है। लिंक फ़ंक्शन में, पहले पैरामीटर (आमतौर पर scope) का उपयोग करें ।

  2. scope: true- निर्देश एक नया चाइल्ड स्कोप बनाता है जो मूल रूप से पेरेंट स्कोप से विरासत में मिला है। माता-पिता के दायरे में परिभाषित गुण निर्देश के लिए उपलब्ध हैं scope(क्योंकि प्रोटोटाइप उत्तराधिकार के कारण)। बस एक आदिम स्कोप प्रॉपर्टी में लिखने से सावधान रहें - यह डायरेक्टिव स्कोप (जो उसी नाम की पेरेंट स्कोप प्रॉपर्टी को हाईड / शैडो करता है) पर एक नई प्रॉपर्टी बनाएगा।

  3. scope: { ... }- निर्देश एक नया पृथक / पृथक क्षेत्र बनाता है। यह मूल रूप से मूल दायरा नहीं है। आप अभी भी माता-पिता के दायरे का उपयोग कर सकते हैं $parent, लेकिन यह सामान्य रूप से अनुशंसित नहीं है। इसके बजाय, आप निर्दिष्ट करना चाहिए जो माता-पिता गुंजाइश गुण (और / या समारोह) जहां निर्देश प्रयोग किया जाता है एक ही तत्व पर अतिरिक्त गुण, का उपयोग कर के माध्यम से निर्देश की जरूरत है =, @और &संकेतन।

  4. transclude: true- निर्देश एक नया "ट्रांसकोडेड" चाइल्ड स्कोप बनाता है, जो मूल रूप से पेरेंट स्कोप से विरासत में मिला है। यदि निर्देश भी एक अलग गुंजाइश बनाता है, तो ट्रांसकोड किया गया और अलग-अलग स्कोप्स भाई बहन हैं। $parentप्रत्येक दायरे की संपत्ति एक ही मूल क्षेत्र का संदर्भ देती है।
    कोणीय v1.3 अद्यतन : यदि निर्देश भी एक अलग गुंजाइश बनाता है, तो transcluded गुंजाइश अब अलग गुंजाइश का एक बच्चा है। ट्रांसकोडेड और आइसोलेटेड स्कोप अब भाई बहन नहीं हैं। $parentट्रांसकोडेड स्कोप की संपत्ति अब अलग-अलग स्कोप का संदर्भ देती है।

उपरोक्त लिंक में सभी 4 प्रकार के उदाहरण और चित्र हैं।

आप निर्देश के संकलन समारोह में गुंजाइश का उपयोग नहीं कर सकते हैं (जैसा कि यहां बताया गया है: https://github.com/angular/angular.js/wiki/Understanding-Directives )। आप लिंक फ़ंक्शन में निर्देश के दायरे तक पहुंच सकते हैं।

देख रहे:

1. और 2 से ऊपर: आम तौर पर आप निर्दिष्ट करते हैं कि किस अभिभावक को एक विशेषता के माध्यम से निर्देश की जरूरत है, तो $ इसे देखें:

<div my-dir attr1="prop1"></div>

scope.$watch(attrs.attr1, function() { ... });

यदि आप ऑब्जेक्ट प्रॉपर्टी देख रहे हैं, तो आपको $ parse का उपयोग करना होगा:

<div my-dir attr2="obj.prop2"></div>

var model = $parse(attrs.attr2);
scope.$watch(model, function() { ... });

3. ऊपर (अलग-अलग स्कोप), उस नाम को देखें जिसे आप निर्देश @या गुण का उपयोग कर देते हैं =:

<div my-dir attr3="{{prop3}}" attr4="obj.prop4"></div>

scope: {
  localName3: '@attr3',
  attr4:      '='  // here, using the same name as the attribute
},
link: function(scope, element, attrs) {
   scope.$watch('localName3', function() { ... });
   scope.$watch('attr4',      function() { ... });

1
धन्यवाद, निशान। यह समाधान मैं बाहर कैसे चर के साथ एक आंशिक रेंडर करने के लिए पर पोस्ट किया जाता है वास्तव में काफी खूबसूरती से काम करता है। क्या आप वास्तव में मुझे जोड़ने की जरूरत थी कुछ शीर्षक था "HTML लिखने की बारीकियों और पहचानने कि आपके तत्व एनजी-नियंत्रक के अंदर नेस्टेड नहीं है कि आपको लगता है कि यह है।" वाह ... बदमाश गलती। लेकिन यह आपके अन्य (बहुत लंबे समय तक) उत्तर देने वाले स्कैप्स का एक उपयोगी जोड़ है।
कोलेन जूल

@ कोल्लिन, महान, मुझे खुशी है कि आपने अपना मुद्दा हल कर लिया है, क्योंकि मुझे यकीन नहीं था कि आपके दूसरे (अब हटाए गए) टिप्पणी का जवाब कैसे दिया जाए।
मार्क राजकोक

मुझे क्या सामान करना चाहिए / करना चाहिएscope.$watch('localName3', function() { ...[?? WHAT TO DO HERE for example?] });
जुनैद कादिर

1
@ और, नहीं के $parseसाथ प्रयोग नहीं करते हैं =: बेला$parseकेवल गैर-पृथक स्कोप के साथ की आवश्यकता है।
मार्क राजकॉक

1
यह एक महान जवाब है, बहुत गहन है। इससे यह भी पता चलता है कि मुझे केवल AngularJS के साथ काम करने से नफरत क्यों है।
जॉन त्रिचेरो

51

कंट्रोलर मेथड एक्सेस करने का अर्थ है, डायरेक्टर कंट्रोलर / लिंक / स्कोप से पेरेंट स्कोप पर एक विधि एक्सेस करना।

यदि निर्देश जनक दायरे को साझा / विरासत में प्राप्त कर रहा है, तो यह सिर्फ एक माता-पिता गुंजाइश पद्धति को लागू करने के लिए काफी आगे है।

जब आप पृथक निर्देशात्मक दायरे से अभिभावक कार्यक्षेत्र विधि का उपयोग करना चाहते हैं, तो थोड़ा अधिक कार्य आवश्यक है।

कुछ विकल्प (नीचे सूचीबद्ध से अधिक हो सकते हैं) एक पैरेंट स्कोप विधि को अलग-अलग डायरेक्शन स्कोप से देखने के लिए या पेरेंट स्कोप वैरिएबल ( विकल्प # 6 विशेष रूप से) के लिए हैं।

ध्यान दें कि मैंने link functionइन उदाहरणों में उपयोग किया है लेकिन आप एक का उपयोग कर सकते हैंdirective controller आवश्यकता के आधार पर ।

विकल्प 1। ऑब्जेक्ट शाब्दिक और निर्देशक HTML टेम्पलेट से

index.html

<!DOCTYPE html>
<html ng-app="plunker">

  <head>
    <meta charset="utf-8" />
    <title>AngularJS Plunker</title>
    <script>document.write('<base href="' + document.location + '" />');</script>
    <link rel="stylesheet" href="style.css" />
    <script data-require="angular.js@1.3.x" src="https://code.angularjs.org/1.3.9/angular.js" data-semver="1.3.9"></script>
    <script src="app.js"></script>
  </head>

  <body ng-controller="MainCtrl">
    <p>Hello {{name}}!</p>

    <p> Directive Content</p>
    <sd-items-filter selected-items="selectedItems" selected-items-changed="selectedItemsChanged(selectedItems)" items="items"> </sd-items-filter>


    <P style="color:red">Selected Items (in parent controller) set to: {{selectedItemsReturnedFromDirective}} </p>

  </body>

</html>

itemfilterTemplate.html

<select ng-model="selectedItems" multiple="multiple" style="height: 200px; width: 250px;" ng-change="selectedItemsChanged({selectedItems:selectedItems})" ng-options="item.id as item.name group by item.model for item in items | orderBy:'name'">
  <option>--</option>
</select>

app.js

var app = angular.module('plunker', []);

app.directive('sdItemsFilter', function() {
  return {
    restrict: 'E',
    scope: {
      items: '=',
      selectedItems: '=',
      selectedItemsChanged: '&'
    },
    templateUrl: "itemfilterTemplate.html"
  }
})

app.controller('MainCtrl', function($scope) {
  $scope.name = 'TARS';

  $scope.selectedItems = ["allItems"];

  $scope.selectedItemsChanged = function(selectedItems1) {
    $scope.selectedItemsReturnedFromDirective = selectedItems1;
  }

  $scope.items = [{
    "id": "allItems",
    "name": "All Items",
    "order": 0
  }, {
    "id": "CaseItem",
    "name": "Case Item",
    "model": "PredefinedModel"
  }, {
    "id": "Application",
    "name": "Application",
    "model": "Bank"
    }]

});

काम कर रहे plnkr: http://plnkr.co/edit/rgKUsYGDo9O3tewL6xgr?p=preview

विकल्प 2। ऑब्जेक्ट शाब्दिक और प्रत्यक्ष लिंक / दायरे से

index.html

<!DOCTYPE html>
<html ng-app="plunker">

  <head>
    <meta charset="utf-8" />
    <title>AngularJS Plunker</title>
    <script>document.write('<base href="' + document.location + '" />');</script>
    <link rel="stylesheet" href="style.css" />
    <script data-require="angular.js@1.3.x" src="https://code.angularjs.org/1.3.9/angular.js" data-semver="1.3.9"></script>
    <script src="app.js"></script>
  </head>

  <body ng-controller="MainCtrl">
    <p>Hello {{name}}!</p>

    <p> Directive Content</p>
    <sd-items-filter selected-items="selectedItems" selected-items-changed="selectedItemsChanged(selectedItems)" items="items"> </sd-items-filter>


    <P style="color:red">Selected Items (in parent controller) set to: {{selectedItemsReturnedFromDirective}} </p>

  </body>

</html>

itemfilterTemplate.html

<select ng-model="selectedItems" multiple="multiple" style="height: 200px; width: 250px;" 
 ng-change="selectedItemsChangedDir()" ng-options="item.id as item.name group by item.model for item in items | orderBy:'name'">
  <option>--</option>
</select>

app.js

var app = angular.module('plunker', []);

app.directive('sdItemsFilter', function() {
  return {
    restrict: 'E',
    scope: {
      items: '=',
      selectedItems: '=',
      selectedItemsChanged: '&'
    },
    templateUrl: "itemfilterTemplate.html",
    link: function (scope, element, attrs){
      scope.selectedItemsChangedDir = function(){
        scope.selectedItemsChanged({selectedItems:scope.selectedItems});  
      }
    }
  }
})

app.controller('MainCtrl', function($scope) {
  $scope.name = 'TARS';

  $scope.selectedItems = ["allItems"];

  $scope.selectedItemsChanged = function(selectedItems1) {
    $scope.selectedItemsReturnedFromDirective = selectedItems1;
  }

  $scope.items = [{
    "id": "allItems",
    "name": "All Items",
    "order": 0
  }, {
    "id": "CaseItem",
    "name": "Case Item",
    "model": "PredefinedModel"
  }, {
    "id": "Application",
    "name": "Application",
    "model": "Bank"
    }]
});

काम कर रहे plnkr: http://plnkr.co/edit/BRvYm2SpSpBK9uxNIcTa?p=preview

विकल्प # 3। फ़ंक्शन संदर्भ के माध्यम से और निर्देशक HTML टेम्पलेट से

index.html

<!DOCTYPE html>
<html ng-app="plunker">

  <head>
    <meta charset="utf-8" />
    <title>AngularJS Plunker</title>
    <script>document.write('<base href="' + document.location + '" />');</script>
    <link rel="stylesheet" href="style.css" />
    <script data-require="angular.js@1.3.x" src="https://code.angularjs.org/1.3.9/angular.js" data-semver="1.3.9"></script>
    <script src="app.js"></script>
  </head>

  <body ng-controller="MainCtrl">
    <p>Hello {{name}}!</p>

    <p> Directive Content</p>
    <sd-items-filter selected-items="selectedItems" selected-items-changed="selectedItemsChanged" items="items"> </sd-items-filter>


    <P style="color:red">Selected Items (in parent controller) set to: {{selectedItemsReturnFromDirective}} </p>

  </body>

</html>

itemfilterTemplate.html

<select ng-model="selectedItems" multiple="multiple" style="height: 200px; width: 250px;" 
 ng-change="selectedItemsChanged()(selectedItems)" ng-options="item.id as item.name group by item.model for item in items | orderBy:'name'">
  <option>--</option>
</select>

app.js

var app = angular.module('plunker', []);

app.directive('sdItemsFilter', function() {
  return {
    restrict: 'E',
    scope: {
      items: '=',
      selectedItems:'=',
      selectedItemsChanged: '&'
    },
    templateUrl: "itemfilterTemplate.html"
  }
})

app.controller('MainCtrl', function($scope) {
  $scope.name = 'TARS';

  $scope.selectedItems = ["allItems"];

  $scope.selectedItemsChanged = function(selectedItems1) {
    $scope.selectedItemsReturnFromDirective = selectedItems1;
  }

  $scope.items = [{
    "id": "allItems",
    "name": "All Items",
    "order": 0
  }, {
    "id": "CaseItem",
    "name": "Case Item",
    "model": "PredefinedModel"
  }, {
    "id": "Application",
    "name": "Application",
    "model": "Bank"
    }]
});

काम कर रहे plnkr: http://plnkr.co/edit/Jo6FcYfVXCCg3vH42BIz?p=preview

विकल्प # 4। फ़ंक्शन संदर्भ के माध्यम से और निर्देश लिंक / गुंजाइश से

index.html

<!DOCTYPE html>
<html ng-app="plunker">

  <head>
    <meta charset="utf-8" />
    <title>AngularJS Plunker</title>
    <script>document.write('<base href="' + document.location + '" />');</script>
    <link rel="stylesheet" href="style.css" />
    <script data-require="angular.js@1.3.x" src="https://code.angularjs.org/1.3.9/angular.js" data-semver="1.3.9"></script>
    <script src="app.js"></script>
  </head>

  <body ng-controller="MainCtrl">
    <p>Hello {{name}}!</p>

    <p> Directive Content</p>
    <sd-items-filter selected-items="selectedItems" selected-items-changed="selectedItemsChanged" items="items"> </sd-items-filter>


    <P style="color:red">Selected Items (in parent controller) set to: {{selectedItemsReturnedFromDirective}} </p>

  </body>

</html>

itemfilterTemplate.html

<select ng-model="selectedItems" multiple="multiple" style="height: 200px; width: 250px;" ng-change="selectedItemsChangedDir()" ng-options="item.id as item.name group by item.model for item in items | orderBy:'name'">
  <option>--</option>
</select>

app.js

var app = angular.module('plunker', []);

app.directive('sdItemsFilter', function() {
  return {
    restrict: 'E',
    scope: {
      items: '=',
      selectedItems: '=',
      selectedItemsChanged: '&'
    },
    templateUrl: "itemfilterTemplate.html",
    link: function (scope, element, attrs){
      scope.selectedItemsChangedDir = function(){
        scope.selectedItemsChanged()(scope.selectedItems);  
      }
    }
  }
})

app.controller('MainCtrl', function($scope) {
  $scope.name = 'TARS';

  $scope.selectedItems = ["allItems"];

  $scope.selectedItemsChanged = function(selectedItems1) {
    $scope.selectedItemsReturnedFromDirective = selectedItems1;
  }

  $scope.items = [{
    "id": "allItems",
    "name": "All Items",
    "order": 0
  }, {
    "id": "CaseItem",
    "name": "Case Item",
    "model": "PredefinedModel"
  }, {
    "id": "Application",
    "name": "Application",
    "model": "Bank"
    }]

});

काम कर रहे plnkr: http://plnkr.co/edit/BSqx2J1yCY86IJwAnQF1?p=preview

विकल्प # 5: एनजी-मॉडल और दो तरह से बाध्यकारी के माध्यम से, आप पैरेंट स्कोप वैरिएबल को अपडेट कर सकते हैं। । इसलिए, आपको कुछ मामलों में पैरेंट स्कोप फ़ंक्शंस को आमंत्रित करने की आवश्यकता नहीं हो सकती है।

index.html

<!DOCTYPE html>
<html ng-app="plunker">

  <head>
    <meta charset="utf-8" />
    <title>AngularJS Plunker</title>
    <script>document.write('<base href="' + document.location + '" />');</script>
    <link rel="stylesheet" href="style.css" />
    <script data-require="angular.js@1.3.x" src="https://code.angularjs.org/1.3.9/angular.js" data-semver="1.3.9"></script>
    <script src="app.js"></script>
  </head>

  <body ng-controller="MainCtrl">
    <p>Hello {{name}}!</p>

    <p> Directive Content</p>
    <sd-items-filter ng-model="selectedItems" selected-items-changed="selectedItemsChanged" items="items"> </sd-items-filter>


    <P style="color:red">Selected Items (in parent controller) set to: {{selectedItems}} </p>

  </body>

</html>

itemfilterTemplate.html

<select ng-model="selectedItems" multiple="multiple" style="height: 200px; width: 250px;" 
 ng-options="item.id as item.name group by item.model for item in items | orderBy:'name'">
  <option>--</option>
</select>

app.js

var app = angular.module('plunker', []);

app.directive('sdItemsFilter', function() {
  return {
    restrict: 'E',
    scope: {
      items: '=',
      selectedItems: '=ngModel'
    },
    templateUrl: "itemfilterTemplate.html"
  }
})

app.controller('MainCtrl', function($scope) {
  $scope.name = 'TARS';

  $scope.selectedItems = ["allItems"];

  $scope.items = [{
    "id": "allItems",
    "name": "All Items",
    "order": 0
  }, {
    "id": "CaseItem",
    "name": "Case Item",
    "model": "PredefinedModel"
  }, {
    "id": "Application",
    "name": "Application",
    "model": "Bank"
    }]
});

काम कर रहे plnkr: http://plnkr.co/edit/hNui3xgzdTnfcdzljihY?p=preview

विकल्प # 6: के माध्यम से $watchऔर$watchCollection यह itemsउपरोक्त सभी उदाहरणों के लिए दो तरह से बाध्यकारी है , यदि आइटम माता-पिता के दायरे में संशोधित किए जाते हैं, तो निर्देश में आइटम भी परिवर्तनों को प्रतिबिंबित करेंगे।

आप माता-पिता दायरे से अन्य विशेषताओं या वस्तुओं में देखना चाहते हैं, तो आप उस का उपयोग कर सकते $watchहैं और $watchCollectionनीचे दिए गए के रूप में

एचटीएमएल

<!DOCTYPE html>
<html ng-app="plunker">

<head>
  <meta charset="utf-8" />
  <title>AngularJS Plunker</title>
  <script>
    document.write('<base href="' + document.location + '" />');
  </script>
  <link rel="stylesheet" href="style.css" />
  <script data-require="angular.js@1.3.x" src="https://code.angularjs.org/1.3.9/angular.js" data-semver="1.3.9"></script>
  <script src="app.js"></script>
</head>

<body ng-controller="MainCtrl">
  <p>Hello {{user}}!</p>
  <p>directive is watching name and current item</p>
  <table>
    <tr>
      <td>Id:</td>
      <td>
        <input type="text" ng-model="id" />
      </td>
    </tr>
    <tr>
      <td>Name:</td>
      <td>
        <input type="text" ng-model="name" />
      </td>
    </tr>
    <tr>
      <td>Model:</td>
      <td>
        <input type="text" ng-model="model" />
      </td>
    </tr>
  </table>

  <button style="margin-left:50px" type="buttun" ng-click="addItem()">Add Item</button>

  <p>Directive Contents</p>
  <sd-items-filter ng-model="selectedItems" current-item="currentItem" name="{{name}}" selected-items-changed="selectedItemsChanged" items="items"></sd-items-filter>

  <P style="color:red">Selected Items (in parent controller) set to: {{selectedItems}}</p>
</body>

</html>

स्क्रिप्ट app.js

var app = angular.module ('प्लंकर', []);

app.directive('sdItemsFilter', function() {
  return {
    restrict: 'E',
    scope: {
      name: '@',
      currentItem: '=',
      items: '=',
      selectedItems: '=ngModel'
    },
    template: '<select ng-model="selectedItems" multiple="multiple" style="height: 140px; width: 250px;"' +
      'ng-options="item.id as item.name group by item.model for item in items | orderBy:\'name\'">' +
      '<option>--</option> </select>',
    link: function(scope, element, attrs) {
      scope.$watchCollection('currentItem', function() {
        console.log(JSON.stringify(scope.currentItem));
      });
      scope.$watch('name', function() {
        console.log(JSON.stringify(scope.name));
      });
    }
  }
})

 app.controller('MainCtrl', function($scope) {
  $scope.user = 'World';

  $scope.addItem = function() {
    $scope.items.push({
      id: $scope.id,
      name: $scope.name,
      model: $scope.model
    });
    $scope.currentItem = {};
    $scope.currentItem.id = $scope.id;
    $scope.currentItem.name = $scope.name;
    $scope.currentItem.model = $scope.model;
  }

  $scope.selectedItems = ["allItems"];

  $scope.items = [{
    "id": "allItems",
    "name": "All Items",
    "order": 0
  }, {
    "id": "CaseItem",
    "name": "Case Item",
    "model": "PredefinedModel"
  }, {
    "id": "Application",
    "name": "Application",
    "model": "Bank"
  }]
});

निर्देशों के बारे में विस्तृत विवरण के लिए आप हमेशा AngularJs प्रलेखन का उल्लेख कर सकते हैं।


10
वह अपने रेप के लिए कड़ी मेहनत करता है ... अपने रेप के लिए बहुत मेहनत करता है ... वह अपने रेप के लिए कड़ी मेहनत करता है इसलिए आप उसे सही तरीके से आगे बढ़ाते हैं।
स्लिम

7
डाउनवोट - उत्तर के भीतर कोई भी मूल्यवान जानकारी इसकी लंबाई के कारण दुर्गम है
निवारण करें

2
मैंने स्पष्ट पृथक्करण के साथ सभी उपलब्ध विकल्पों के साथ प्रश्न का उत्तर दिया। मेरी राय में, जब तक आपके सामने एक बड़ी तस्वीर नहीं होती, तब तक संक्षिप्त उत्तर हमेशा मददगार नहीं होते।
योगेश मैनवेयर

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

यह वोट डाउन करने का कारण नहीं है। लोग इस privlege दुरुपयोग
Winnemucca

11
 scope: false
 transclude: false

और आपके पास एक ही गुंजाइश होगी (मूल तत्व के साथ)

$scope.$watch(...

इस दो विकल्पों के दायरे और ट्रांसक्लूड के आधार पर माता-पिता के दायरे का उपयोग करने के कई तरीके हैं।


हां, छोटा और मीठा और सही। वे मूल तत्व के समान सटीक गुंजाइश साझा करते हैं, हालांकि ... जो उन्हें उसी दायरे में फिर से उपयोग करना असंभव बनाता है। jsfiddle.net/collindo/xqytH
21-28:

2
जब हम पुन: प्रयोज्य घटक लिखते हैं, तो कई बार हमें अलग-थलग गुंजाइश की आवश्यकता होती है, इसलिए इसका समाधान इतना आसान नहीं है
यवन हुआन

8

यहां मैंने एक बार एक चाल का उपयोग किया है: माता-पिता के दायरे को रखने के लिए एक "डमी" निर्देश बनाएं और इसे वांछित निर्देशन के बाहर कहीं रखें। कुछ इस तरह:

module.directive('myDirectiveContainer', function () {
    return {
        controller: function ($scope) {
            this.scope = $scope;
        }
    };
});

module.directive('myDirective', function () {
    return {
        require: '^myDirectiveContainer',
        link: function (scope, element, attrs, containerController) {
            // use containerController.scope here...
        }
    };
});

और फिर

<div my-directive-container="">
    <div my-directive="">
    </div>
</div>

शायद सबसे सुंदर समाधान नहीं है, लेकिन यह काम हो गया।


4

यदि आप ईएस 6 क्लासेस और ControllerAsसिंटैक्स का उपयोग कर रहे हैं , तो आपको कुछ अलग करने की आवश्यकता है।

नीचे दिए गए स्निपेट और ध्यान दें कि देखें vmहै ControllerAsके रूप में माता पिता के HTML में इस्तेमाल माता पिता नियंत्रक का मूल्य

myApp.directive('name', function() {
  return {
    // no scope definition
    link : function(scope, element, attrs, ngModel) {

        scope.vm.func(...)

0

सब कुछ करने की कोशिश करने के बाद, मैं अंत में एक समाधान के साथ आया।

बस अपने टेम्पलेट में निम्नलिखित रखें:

{{currentDirective.attr = parentDirective.attr; ''}}

यह सिर्फ मूल स्कोप विशेषता / वैरिएबल लिखता है जिसे आप वर्तमान स्कोप तक पहुँचना चाहते हैं।

; ''बयान के अंत में भी ध्यान दें , यह सुनिश्चित करना है कि आपके टेम्पलेट में कोई आउटपुट नहीं है। (कोणीय प्रत्येक कथन का मूल्यांकन करता है, लेकिन केवल अंतिम आउटपुट देता है)।

यह थोड़ा हैकी है, लेकिन परीक्षण और त्रुटि के कुछ घंटों के बाद, यह काम करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.