কৌনিক নির্দেশের মধ্যে থেকে কীভাবে অ্যাংুলারজেএস-এ * নিজস্ব সুযোগ * পিতামাতাদের স্কোপ অ্যাক্সেস করবেন?


327

আমি কোনও নির্দেশকের মধ্যে "পিতামাতা" স্কোপ অ্যাক্সেসের যে কোনও পদ্ধতিতে সন্ধান করছি। ক্ষেত্রের কোনও সংমিশ্রণ, লিপিবদ্ধকরণ, প্রয়োজনীয়তা, উপরের দিক থেকে ভেরিয়েবলগুলি (বা স্কোপ নিজেই) পাস করা ইত্যাদি I'm উদাহরণস্বরূপ, আমি জানি $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

দেখুন কি পরিধি তারতম্য প্রটোটাইপ / prototypical এর AngularJS মধ্যে উত্তরাধিকার হয়?

সংক্ষিপ্তসার হিসাবে: কোনও নির্দেশিকা তার পিতামাতার ( $parent) স্কোপকে যেভাবে অ্যাক্সেস করে তা নির্দেশকটি কীভাবে সুযোগ তৈরি করে তার উপর নির্ভর করে:

  1. ডিফল্ট ( scope: false) - নির্দেশিকা একটি নতুন সুযোগ তৈরি করে না, সুতরাং এখানে কোনও উত্তরাধিকার নেই। নির্দেশকের সুযোগটি পিতামাতা / ধারক হিসাবে একই সুযোগ। লিঙ্ক ফাংশনে, প্রথম প্যারামিটার ব্যবহার করুন (সাধারণত scope)।

  2. scope: true- নির্দেশনাটি একটি নতুন বাচ্চার সুযোগ তৈরি করে যা মূলত অভিভাবকের সুযোগ থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হয়। অভিভাবকদের স্কোপে সংজ্ঞাযুক্ত scopeবৈশিষ্ট্যগুলি নির্দেশের জন্য উপলব্ধ (প্রোটোটাইপাল উত্তরাধিকারের কারণে)। কোনও আদিম স্কোপ সম্পত্তিকে লেখার বিষয়ে সচেতন থাকুন - যা নির্দেশের সুযোগে একটি নতুন সম্পত্তি তৈরি করবে (যা একই নামের প্যারেন্ট স্কোপ সম্পত্তিটি আড়াল করে / ছায়া দেয়)।

  3. scope: { ... }- নির্দেশনাটি একটি নতুন বিচ্ছিন্ন / বিচ্ছিন্ন সুযোগ তৈরি করে। এটি প্রোটোটাইপিকভাবে পিতামাতার সুযোগের উত্তরাধিকারী হয় না। আপনি এখনও প্যারেন্ট স্কোপ ব্যবহার করে অ্যাক্সেস করতে পারেন $parentতবে এটি সাধারণত সুপারিশ করা হয় না। পরিবর্তে, আপনি উল্লেখ উচিত যা পিতা বা মাতা সুযোগ বৈশিষ্ট্যাবলী (এবং / অথবা ফাংশন) যেখানে নির্দেশ ব্যবহার করা হয় একই উপাদান অতিরিক্ত বৈশিষ্ট্যাবলী ব্যবহার মাধ্যমে নির্দেশ চাহিদা =, @এবং &স্বরলিপি।

  4. transclude: true- নির্দেশিকাটি একটি নতুন "ট্রান্সক্লুডড" শিশু সুযোগ তৈরি করে, যা মূলত অভিভাবকের সুযোগ থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হয়। যদি নির্দেশিকাটিও একটি বিচ্ছিন্ন সুযোগ তৈরি করে তবে ট্রান্সক্লসড এবং বিচ্ছিন্ন স্কোপগুলি ভাইবোন হয়। $parentপ্রতিটি সুযোগ সম্পত্তির একই পিতা বা মাতা সুযোগ রেফারেন্স।
    কৌণিক v1.3 আপডেট : যদি নির্দেশিকাটিও একটি বিচ্ছিন্ন সুযোগ তৈরি করে, তবে ট্রান্সক্লোকড স্কোপটি এখন বিচ্ছিন্ন সুযোগের শিশু। স্থানান্তরিত এবং বিচ্ছিন্ন স্কোপগুলি আর ভাইবোন নয়। $parentপ্রতিলিপ্ত সুযোগ সম্পত্তির এখন বিছিন্ন সুযোগ রেফারেন্স।

উপরের লিঙ্কটিতে সমস্ত 4 ধরণের উদাহরণ এবং ছবি রয়েছে।

আপনি নির্দেশিকার সংকলন ফাংশনে সুযোগটি অ্যাক্সেস করতে পারবেন না (যেমন এখানে উল্লেখ করা হয়েছে: https://github.com/angular/angular.js/wiki/Unders સમજ- নির্দেশিকা )। আপনি লিঙ্ক ফাংশনে নির্দেশকের সুযোগ অ্যাক্সেস করতে পারেন।

ওয়াচিং:

উপরের ১ এবং ২ এর জন্য: সাধারণত আপনি কোনও বৈশিষ্ট্যের মাধ্যমে কোন পিতামাতার সম্পত্তির দিকনির্দেশনা প্রয়োজন তা নির্দিষ্ট করে দেন, তারপরে $ এটি দেখুন:

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

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

আপনি যদি কোনও বস্তুর সম্পত্তি দেখছেন তবে আপনাকে, পার্স ব্যবহার করতে হবে:

<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
ধন্যবাদ, মার্ক। এটি ভেরিয়েবলের সাথে আংশিক রেন্ডার করতে কীভাবে পোস্ট করেছি সেই সমাধানটি সত্যিই বেশ সুন্দরভাবে কাজ করে। "আমাকে এইচটিএমএল লেখার প্রয়োজনীয়তা এবং স্বীকৃতি দেওয়া যে আপনার উপাদানটি এনজি-কন্ট্রোলারের অভ্যন্তরে বাসা বেঁধেছে না এমন শিরোনামের শিরোনামের এমন একটি বিষয় যা শিরোনামে আপনাকে লিঙ্ক করার দরকার ছিল" " বাহ ... রুকি ভুল তবে এটি আপনার অন্যান্য (আরও দীর্ঘ) উত্তরগুলির স্কোপগুলি ব্যাখ্যা করার জন্য একটি দরকারী সংযোজন।
কলিইন

@ ক্যালিন, দুর্দান্ত, আপনি আপনার সমস্যা সমাধান করেছেন বলে আমি আনন্দিত, যেহেতু আমি আপনার অন্যান্য (এখন মুছে ফেলা) মন্তব্যে কীভাবে প্রতিক্রিয়া জানাতে পারি তা আমি নিশ্চিত ছিলাম না।
রাজকোক

আমি কী scope.$watch('localName3', function() { ...[?? WHAT TO DO HERE for example?] });
স্টাফের

1
@Andy, কোন ব্যবহার করবেন না $parseসঙ্গে =: বেহালার$parseশুধুমাত্র বিচ্ছিন্ন স্কোপগুলির সাথে প্রয়োজনীয়।
মার্ক রাজকক

1
এটি একটি দুর্দান্ত উত্তর, খুব পুঙ্খানুপুঙ্খ। আমি কেন AngularJS এর ​​সাথে কাজ করা ঘৃণা করি তা এটিও ব্যাখ্যা করে।
জন ট্রাইচেরো

51

নিয়ামক পদ্ধতি অ্যাক্সেস মানে হ'ল নির্দেশক নিয়ামক / লিংক / স্কোপ থেকে পিতামাতার স্কোপে কোনও পদ্ধতিতে অ্যাক্সেস।

যদি নির্দেশটি পিতামাত স্কোপ ভাগ করে / উত্তরাধিকারী হয় তবে কেবল পিতামাতাদের স্কোপ পদ্ধতিতে প্রার্থনা করা বেশ সোজা।

বিচ্ছিন্ন নির্দেশের সুযোগ থেকে যখন প্যারেন্ট স্কোপ পদ্ধতিটি অ্যাক্সেস করতে চান তখন আরও কিছু কাজ প্রয়োজন।

বিচ্ছিন্ন নির্দেশের সুযোগ থেকে প্যারেন্ট স্কোপ পদ্ধতিটি চাওয়া বা প্যারেন্ট স্কোপ ভেরিয়েবলগুলি দেখার জন্য কয়েকটি অপশন রয়েছে (নীচে তালিকাভুক্তের চেয়ে বেশি হতে পারে) ( বিশেষত # বিকল্প 6 )।

বিঃদ্রঃ যে আমি link functionএই উদাহরণগুলিতে ব্যবহার করেছি তবে আপনি directive controllerপ্রয়োজনের উপর ভিত্তি করে একটিও ব্যবহার করতে পারেন ।

বিকল্প 1. আক্ষরিক মাধ্যমে এবং নির্দেশক এইচটিএমএল টেমপ্লেট থেকে

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= পূর্বরূপ

অপশন # 2। আক্ষরিক মাধ্যমে এবং নির্দেশমূলক লিঙ্ক / সুযোগ থেকে link

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= পূর্বরূপ

অপশন # 3। ফাংশন রেফারেন্সের মাধ্যমে এবং নির্দেশক এইচটিএমএল টেমপ্লেট থেকে

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= পূর্বরূপ

অপশন # 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=

বিকল্প # 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=

বিকল্প # 6: মাধ্যমে $watchএবং$watchCollectionitems উপরোক্ত সমস্ত উদাহরণের এটি দ্বিপথের জন্য বাধ্যতামূলক , যদি আইটেমগুলি প্যারেন্ট স্কোপে পরিবর্তিত হয় তবে নির্দেশিক আইটেমগুলিও পরিবর্তনগুলি প্রতিফলিত করে।

আপনি যদি প্যারেন্ট স্কোপ থেকে অন্যান্য বৈশিষ্ট্য বা অবজেক্ট দেখতে চান তবে আপনি এটি ব্যবহার করে এটি করতে পারেন $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 অ্যাপ্লিকেশন = কৌণিক.মডিউল ('plunker', []);

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"
  }]
});

নির্দেশাবলী সম্পর্কে বিশদ ব্যাখ্যার জন্য আপনি সর্বদা অ্যাংুলারজেস ডকুমেন্টেশন উল্লেখ করতে পারেন।


10
তিনি তার খবরের পক্ষে কঠোর পরিশ্রম করেন ... তার প্রতিনিধিদের জন্য এতটা কঠোর ... তিনি তাঁর প্রতিনিধির পক্ষে কঠোর পরিশ্রম করেন যাতে আপনি তাকে আরও সঠিকভাবে উন্নীত করতে পারেন।
পাতলা

7
downvoted - উত্তর মধ্যে যে কোনো মূল্যবান তথ্য তার দৈর্ঘ্য কারণে অ্যাক্সেসযোগ্য নয়
প্রতিকার

2
আমি স্পষ্ট পৃথকীকরণের সাথে সমস্ত উপলব্ধ বিকল্পের সাথে প্রশ্নের উত্তর দিয়েছি। আমার মতে, আপনার সামনে একটি বড় ছবি না আসা পর্যন্ত সংক্ষিপ্ত উত্তরগুলি সর্বদা সহায়ক হয় না।
যোগেশ ম্যানওয়্যার

@ যোগেশম্যানওয়্যার: স্টাইলশিটগুলির মতো অপ্রাসঙ্গিক জিনিসগুলি রেখে, লম্বা মার্কআপ ব্যবহার না করে, "গ্রুপ বাই" এর মতো জিনিসগুলি ব্যবহার না করার উদাহরণগুলিকে সহজ করে তোলা ইত্যাদি দ্বারা এটি অনেক ছোট করা যেতে পারে could প্রতিটি উদাহরণ।
হতবাক

এটি ভোট হ্রাস করার কারণ নয়। মানুষ এই privlege অপব্যবহার
Winnemucca,

11
 scope: false
 transclude: false

এবং আপনার একই সুযোগ থাকবে (মূল উপাদান সহ)

$scope.$watch(...

এই দুটি বিকল্প স্কোপ এবং ট্রান্সক্রোলেটের উপর নির্ভর করে প্যারেন্ট স্কোপটিতে কীভাবে অ্যাক্সেস করা যায় সে সম্পর্কে অনেকগুলি উপায় রয়েছে।


হ্যাঁ, সংক্ষিপ্ত এবং মিষ্টি, এবং সঠিক। তারা প্যারেন্ট উপাদান হিসাবে ঠিক একই স্কোপ ভাগ করে নেবে বলে মনে হচ্ছে ... যা তাদের একই সুযোগে পুনরায় ব্যবহার করা অসম্ভব করে তোলে। jsfiddle.net/collindo/xqytH
কল্লিন

2
পুনরায় ব্যবহারযোগ্য উপাদানটি লিখতে গেলে অনেক সময় আমাদের বিচ্ছিন্ন সুযোগের প্রয়োজন হয়, সুতরাং সমাধানটি এত সহজ নয়
Yvon Huynh

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

আপনি যদি ES6 ক্লাস এবং 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; ''}}

এটি কেবল প্যারেন্ট স্কোপ অ্যাট্রিবিউট / ভেরিয়েবল লিখেছে আপনি বর্তমান স্কোপে অ্যাক্সেস করতে চান।

এছাড়াও লক্ষ্য করুন ; ''বিবৃতিটির শেষে এটিকে , এটি নিশ্চিত হওয়া উচিত যে আপনার টেমপ্লেটে কোনও আউটপুট নেই। (কৌণিক প্রতিটি প্রতিবেদনের মূল্যায়ন করে তবে কেবল শেষের বিবরণটি দেয়)।

এটি কিছুটা হ্যাকি, তবে কয়েক ঘন্টা পরীক্ষার এবং ত্রুটির পরেও এটি কাজটি করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.