লিঙ্ক বনাম সংকলন বনাম নিয়ামক


529

আপনি যখন কোনও নির্দেশিকা তৈরি করেন, আপনি সংকলক, লিঙ্ক ফাংশন বা নিয়ামকটিতে কোড রাখতে পারেন।

দস্তাবেজে, তারা তা ব্যাখ্যা করে:

  • কৌনিক চক্রের বিভিন্ন পর্যায়ে সংকলন এবং লিঙ্ক ফাংশন ব্যবহৃত হয়
  • নিয়ন্ত্রণকারীরা নির্দেশকের মধ্যে ভাগ করা হয়

তবে, আমার পক্ষে এটি পরিষ্কার নয় যে কোন ধরণের কোডটি কোথায় যাওয়া উচিত।

উদাহরণস্বরূপ: আমি কি সংকলনগুলিতে ফাংশন তৈরি করতে পারি এবং সেগুলিকে লিঙ্কে স্কোপের সাথে সংযুক্ত করতে পারি বা কেবল নিয়ামকের স্কোপের সাথে ফাংশন সংযুক্ত করতে পারি?

নিয়ামকরা কীভাবে নির্দেশাবলীর মধ্যে ভাগ করা হয়, যদি প্রতিটি নির্দেশকের নিজস্ব নিয়ামক থাকতে পারে? কন্ট্রোলাররা কি সত্যিই ভাগ হয় বা এটি কেবল স্কোপের বৈশিষ্ট্য?




1
আমি ডাইরেক্টিভের লাইফসাইকেলের (চিত্র তৈরির) একটি চিত্র দিয়ে একটি পোস্ট লিখেছি। সম্ভবত এটি কাউকে সহায়তা করে: filimanjaro.com/2014/…
গড় জো

উত্তর:


470

সংকলন:

এটি সেই পর্ব যেখানে অ্যাংুলার আসলে আপনার নির্দেশকে সংকলন করে। প্রদত্ত নির্দেশিকার প্রতিটি রেফারেন্সের জন্য এই সংকলন ফাংশনটি একবারে ডাকা হয়। উদাহরণস্বরূপ, বলুন আপনি এনজি-রিপিট নির্দেশিকা ব্যবহার করছেন। এনজি-রিপিট এর সাথে সংযুক্ত উপাদানটি অনুসন্ধান করতে হবে, এইচটিএমএল খণ্ডটি এটি সংযুক্ত রয়েছে এবং এটি একটি টেম্পলেট ফাংশন তৈরি করতে হবে।

আপনি যদি হ্যান্ডেলবারস, আন্ডারস্কোর টেম্পলেট বা সমতুল্য ব্যবহার করেন তবে এটি কোনও টেম্পলেট ফাংশনটি বের করার জন্য তাদের টেমপ্লেটগুলি সংকলন করার মতো। এই টেম্পলেট ফাংশনে আপনি ডেটা পাস করেন এবং সেই ফাংশনের রিটার্ন মান হ'ল এইচটিএমএল হ'ল সঠিক জায়গায় ডেটা।

সংকলন পর্বটি কৌণিকের সেই পদক্ষেপ যা টেম্পলেট ফাংশনটি ফিরিয়ে দেয়। কৌণিক এই টেম্পলেট ফাংশন লিঙ্কিং ফাংশন বলা হয়।

লিঙ্কিং পর্ব:

লিঙ্কিং পর্বটি যেখানে আপনি লিঙ্কিং ফাংশনে ডেটা ($ স্কোপ) সংযুক্ত করেন এবং এটি আপনাকে লিঙ্কযুক্ত এইচটিএমএল ফিরিয়ে আনবে। যেহেতু নির্দেশিকাটিও এইচটিএমএলটি কোথায় যায় বা কী পরিবর্তিত হয় তা সুনির্দিষ্ট করে বলেও ইতিমধ্যে এটি ভাল। এটি সেই ফাংশন যেখানে আপনি লিঙ্কযুক্ত এইচটিএমএল, অর্থাৎ এইচটিএমএলতে ইতিমধ্যে ডেটা সংযুক্ত থাকাতে পরিবর্তন করতে চান। কৌণিক ক্ষেত্রে যদি আপনি লিঙ্কিং ফাংশনে কোড লিখেন তবে এটি সাধারণত পোস্ট-লিংক ফাংশন (ডিফল্টরূপে)। লিঙ্কিং ফাংশনটি টেমপ্লেটের সাথে ডেটা যুক্ত করার পরে এটি কলব্যাকের মতো।

নিয়ামক:

নিয়ামক এমন এক স্থান যেখানে আপনি কিছু নির্দেশিক নির্দিষ্ট যুক্তি রেখেছিলেন। এই যুক্তি লিংক ফাংশনেও যেতে পারে, তবে তারপরে আপনাকে "যুক্তিযুক্ত" বানানোর জন্য সেই যুক্তিটি আপনাকে সুযোগের মধ্যে রাখতে হবে। সমস্যাটি হ'ল আপনি তারপরে আপনার নির্দেশিকাগুলি দিয়ে সুযোগটি কলুষিত করবেন যা বাস্তবে প্রত্যাশিত কিছু নয়। সুতরাং দুটি নির্দেশিকা যদি একে অপরের সাথে কথা বলতে / একে অপরের সাথে সহযোগিতা করতে চায় তবে বিকল্প কী? অবশ্যই আপনি এই সমস্ত যুক্তিগুলিকে একটি পরিষেবাতে স্থাপন করতে পারেন এবং তারপরে এই উভয় নির্দেশকে সেই পরিষেবার উপর নির্ভর করতে পারেন তবে এটি কেবল আরও একটি নির্ভরতা নিয়ে আসে। বিকল্পটি হল এই সুযোগের জন্য একটি নিয়ামক সরবরাহ করা (সাধারণত স্কোপটি বিচ্ছিন্ন করে?) এবং তারপরে এই নিয়ন্ত্রককে অন্য নির্দেশে প্রবেশ করা হয় যখন সেই নির্দেশটি অন্যটির "প্রয়োজন" হয়।


67
স্পষ্ট করার জন্য: পুরো পৃষ্ঠা জুড়ে টেমপ্লেটটি কম্পাইল করে। লিঙ্কার প্রতিটি দৃষ্টিতে আবদ্ধ। রাইট? নিয়ামক এরপরে উদাহরণগুলির মধ্যে কাজ করে।
জ্লাত্তো

4
প্রতিটি নির্দেশ জন্য @CMCDragonkai controllerফাংশন কার্যকর পর সংকলন, কিন্তু আগে pre-link একটি স্থানীয় DOM গাছ শাখায়। এছাড়াও controllerএবং pre-linkফাংশনগুলি স্থানীয়-ডিওএম শাখাকে উপরে-ডাউন পদ্ধতিতে অনুসরণ করে কার্যকর করা হয়। এর পরে নীচে আপ পদ্ধতিতে post-linkকার্যকর করা হয়।
আর্টেম প্লাটোনভ

9
আপনি যদি বুঝতে না পারেন তবে এটি কেবল গোলমাল। এটি যা করে তা করার একটি কারণ রয়েছে।
ডেমিসেক্স

3
এটি সঠিক প্রযুক্তিগত উত্তর, তবে, আমি কখন লিংক ফাংশনটি ব্যবহার করব তা নিয়ে এখনও প্রশ্ন রেখেছি।
নিকোলাস মার্শাল

2
আমরা কি সব জায়গায় controllerপরিবর্তে ব্যবহার করব link? যাতে ভবিষ্যতে কোডটি পরিবর্তন করার দরকার নেই যদি পদ্ধতিটি ভাগ করে নেওয়া প্রয়োজন বা কিছু যুক্তি প্রবর্তন করা প্রয়োজন ?. controllerলিঙ্কের পরিবর্তে সার্বক্ষণিক ব্যবহারে কোনও সমস্যা আছে কি ?
জেপিএস

99

গুগল টিমের ও'রিলি অ্যাঙ্গুলার জেএস বইতে যা বলা হয়েছে তা আমিও যুক্ত করতে চেয়েছিলাম:

নিয়ামক - একটি নিয়ামক তৈরি করুন যা নির্দেশাবলী জুড়ে যোগাযোগের জন্য একটি এপিআই প্রকাশ করে। এর একটি ভাল উদাহরণ হ'ল ডাইরেক্টিভ টু ডাইরেক্টিভ কমিউনিকেশন

লিঙ্ক - প্রোগ্রামযুক্তভাবে ফলাফল DOM উপাদান দৃষ্টান্তগুলি সংশোধন করুন, ইভেন্ট শ্রোতা যুক্ত করুন এবং ডেটা বাইন্ডিং সেট আপ করুন।

সংকলন - এনজি-রিপিট হিসাবে ব্যবহৃত হিসাবে, নির্দেশের অনুলিপি জুড়ে বৈশিষ্ট্যগুলির জন্য প্রোগ্রামিয়ালি ডিওএম টেম্পলেটটি সংশোধন করুন। আপনার সংকলন ফাংশন ফলাফলের উপাদানগুলির উদাহরণগুলি সংশোধন করতে লিংক ফাংশনগুলিও ফিরিয়ে দিতে পারে।


আপনার চিন্তাবিদ.ও লিঙ্কটি প্রদান না করে দেখা যায় না। আমার লিঙ্কটি নয়, তবে সম্ভবত এটি আরও উপযুক্ত: toddmotto.com/directive-to-directive-communication-with-require
আর ভ্যান

51

একটি directiveআপনাকে ওয়েব উপাদান তৈরির জন্য ঘোষিত ফ্যাশনে এইচটিএমএল শব্দভাণ্ডার প্রসারিত করতে দেয়। ng-appঅ্যাট্রিবিউট একটি নির্দেশ, তাই হয় ng-controllerএবং সব ng- prefixed attributes। দিকনির্দেশনাগুলি হতে পারে attributes, tagsবা এমনকি class names,ও হতে পারে comments

নির্দেশিকা কীভাবে জন্মগ্রহণ করে ( compilationএবং instantiation)

সংকলন: আমরা ডিওএম রেন্ডার করার আগে compileফাংশনটি উভয়ই ব্যবহার করব manipulateএবং কোনও linkফাংশন ফেরত দেব (এটি আমাদের জন্য সংযোগ পরিচালনা করবে)। instancesএই নির্দেশের সমস্তটির সাথে ভাগ করে নেওয়া দরকার এমন কোনও পদ্ধতি রাখার জায়গাও এটি।

লিঙ্ক: আমরা linkনির্দিষ্ট শ্রোতাগুলিকে একটি নির্দিষ্ট ডিওএম উপাদান (যা টেমপ্লেট থেকে ক্লোন করা আছে) তে নিবন্ধিত করতে এবং পৃষ্ঠাতে আমাদের বাইন্ডিংগুলি সেট আপ করতে আমরা ফাংশনটি ব্যবহার করব ।

যদি compile()ফাংশনে সেট করা থাকে তবে সেগুলি কেবল একবার সেট করা হত (যা প্রায়শই আপনি চান)। যদি link()ফাংশনে সেট করা থাকে তবে প্রতিবার এইচটিএমএল উপাদানটি বস্তুর ডেটাতে আবদ্ধ হলে সেগুলি সেট করা হবে ।

<div ng-repeat="i in [0,1,2]">
    <simple>
        <div>Inner content</div>
    </simple>
</div>

app.directive("simple", function(){
   return {
     restrict: "EA",
     transclude:true,
     template:"<div>{{label}}<div ng-transclude></div></div>",        
     compile: function(element, attributes){  
     return {
             pre: function(scope, element, attributes, controller, transcludeFn){

             },
             post: function(scope, element, attributes, controller, transcludeFn){

             }
         }
     },
     controller: function($scope){

     }
   };
});

Compileফাংশনটি preএবং postলিঙ্ক ফাংশনটি প্রদান করে। প্রাক লিঙ্ক ফাংশনে আমাদের উদাহরণ টেম্পলেট এবং এর থেকে স্কোপ রয়েছে controllerতবে তবুও টেমপ্লেটটি স্কোপে আবদ্ধ নয় এবং এখনও লিখিত সামগ্রী ট্রান্সক্লুড করে নি।

Postলিঙ্ক ফাংশনটি যেখানে পোস্ট লিঙ্কটি কার্যকর করা শেষ ফাংশন। এখন transclusionসম্পূর্ণ the template is linked to a scope, এবং view will update with data bound values after the next digest cyclelinkবিকল্প একটি সেট আপ করার জন্য শুধু একটি শর্টকাট post-linkফাংশন।

নিয়ামক: নির্দেশিকা নিয়ামক অন্য নির্দেশিকা সংযোগ / সংকলন পর্যায়ে যেতে পারে। আন্তঃনির্দেশক যোগাযোগের মাধ্যম হিসাবে এটি অন্যান্য ডিরেক্টরিতে ইনজেকশনের ব্যবস্থা করা যেতে পারে।

আপনাকে যে নির্দেশনার প্রয়োজন হবে তার নাম উল্লেখ করতে হবে - এটি একই উপাদান বা তার পিতামাতার সাথে আবদ্ধ হওয়া উচিত। নামটির সাথে উপসর্গ করা যেতে পারে:

?  Will not raise any error if a mentioned directive does not exist.
^  Will look for the directive on parent elements, if not available on the same element.

[‘directive1′, ‘directive2′, ‘directive3′]একাধিক নির্দেশিকা নিয়ামক প্রয়োজন বর্গাকার বন্ধনী ব্যবহার করুন ।

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

app.controller('MainCtrl', function($scope, $element) {
});

app.directive('parentDirective', function() {
  return {
    restrict: 'E',
    template: '<child-directive></child-directive>',
    controller: function($scope, $element){
      this.variable = "Hi Vinothbabu"
    }
  }
});

app.directive('childDirective', function() {
  return {
    restrict:  'E',
    template: '<h1>I am child</h1>',
    replace: true,
    require: '^parentDirective',
    link: function($scope, $element, attr, parentDirectCtrl){
      //you now have access to parentDirectCtrl.variable
    }
  }
});

1
আপনি উল্লেখ করেছেন যে কীভাবে সন্তানের নিয়ামক হিসাবে পিতামাত্রিক নির্দেশিকা Ctrl পেতে হয় ... উদাহরণস্বরূপ সন্তানের কোনও নিয়ামক নেই, বরং লিঙ্ক ফাংশন ... আমি বর্তমানে এই বিষয়টিতে আটকে নেই, তাই এটি নাও হতে পারে এত গুরুত্বপূর্ণ, তবে একটি কৌতূহলী প্রশ্ন।
alockwood05

13

এছাড়াও, একটি নিয়ামক বনাম লিংক ফাংশন (যেহেতু তাদের উভয়ই সুযোগ, উপাদান এবং অনুগ্রহকারীদের অ্যাক্সেস রয়েছে) ব্যবহার করার একটি ভাল কারণ হ'ল আপনি যে কোনও উপলভ্য পরিষেবা বা নির্ভরতা কোনও নিয়ামকের (এবং যে কোনও ক্রমে) পাস করতে পারেন, কারণ আপনি লিঙ্ক ফাংশন দিয়ে এটি করতে পারবেন না। বিভিন্ন স্বাক্ষর লক্ষ করুন:

controller: function($scope, $exceptionHandler, $attr, $element, $parse, $myOtherService, someCrazyDependency) {...

বনাম

link: function(scope, element, attrs) {... //no services allowed

2
আপনি যখন কোনও উত্তরকে নীচে নামাবেন তখন আপনার বক্তব্যটি ব্যাখ্যা করতে দয়া করে একটি মন্তব্য করুন। ধন্যবাদ
এসএমএস

53
আমি downvoter ছিলেন না কিন্তু এটি কঠোরভাবে সঠিক কারণ আপনি এখনও নির্দেশ নিজেই যেমন যেকোনো প্রয়োজনীয় নির্ভরতা উদ্বুদ্ধ করতে পারেন: module.directive('myDirective', function($window) { etc...। এর পরে লিঙ্ক ফাংশনের অভ্যন্তর থেকে এটি অ্যাক্সেস করা যেতে পারে।
মাইক চেম্বারলাইন

1
আপনি লিঙ্ক ফাংশনটিতে পরিষেবাগুলি ইনজেক্ট করতে পারেন বলে এটি সোজাভাবে ভুল বলে মনে হচ্ছে
কোড হুইস্পেরার

1
@ জোশিরিবাকফফ শেষ ফলাফলটি একই, লিঙ্ক ফাংশনে আপনার পরিষেবাতে অ্যাক্সেস রয়েছে। এটি ফাংশনের আর্গুমেন্টে ঘোষিত হয়েছে কিনা তা বিবেচ্য নয়। এই বিষয়ে মাইক চেম্বারলাইন সঠিক
কনার ওয়াইয়াট

1
@ cwyatt1 আমি পার্লেন্সটি সংশোধন করে যাচ্ছিলাম, পিএনএলকিআর কোনও লিঙ্ক () ফাংশনে ইনজেকশন দেখায় না কারণ এটি অ্যাঙ্গুলারের কোনও বৈশিষ্ট্য নয়। আপনি ভাবতে পারেন আমি প্যাডেন্টিক হচ্ছি তবে মেটামেটস মন্তব্য ইতিমধ্যে সেই প্লঙ্কার কী করে এবং কোনও নিয়ামককে ইনজেকশনের মাধ্যমে কী করে তার মধ্যে অনেকগুলি গুরুত্বপূর্ণ পার্থক্যের রূপরেখা দেয়। ওপি জিজ্ঞাসা করছে যে পার্থক্যগুলি কী, এবং সেখানে ভিন্নতা রয়েছে।
জোশ রিবাকফফ

10

নির্দেশমূলক পর্যায়গুলি বোঝার জন্য এটি একটি ভাল নমুনা http://codepen.io/anon/pen/oXMdBQ?editors=101

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

app.directive('slngStylePrelink', function() {
    return {
        scope: {
            drctvName: '@'
        },
        controller: function($scope) {
            console.log('controller for ', $scope.drctvName);
        },
        compile: function(element, attr) {
            console.log("compile for ", attr.name)
            return {
                post: function($scope, element, attr) {
                    console.log('post link for ', attr.name)
                },
                pre: function($scope, element, attr) {
                    $scope.element = element;
                    console.log('pre link for ', attr.name)
                        // from angular.js 1.4.1
                    function ngStyleWatchAction(newStyles, oldStyles) {
                        if (oldStyles && (newStyles !== oldStyles)) {
                            forEach(oldStyles, function(val, style) {
                                element.css(style, '');
                            });
                        }
                        if (newStyles) element.css(newStyles);
                    }

                    $scope.$watch(attr.slngStylePrelink, ngStyleWatchAction, true);

                    // Run immediately, because the watcher's first run is async
                    ngStyleWatchAction($scope.$eval(attr.slngStylePrelink));
                }
            };
        }
    };
});

এইচটিএমএল

<body ng-app="myapp">
    <div slng-style-prelink="{height:'500px'}" drctv-name='parent' style="border:1px solid" name="parent">
        <div slng-style-prelink="{height:'50%'}" drctv-name='child' style="border:1px solid red" name='child'>
        </div>
    </div>
</body>

4
আপনার উপর সম্প্রসারিত কেন এই নমুনা কোড মধ্যে পার্থক্য বুঝতে সাহায্য করবে গেল link, compileএবং controller?
সেল তীক্ষ্ণ

আপনি কী জানেন যে কোনও requireডি-ডাইরেক্টিভ কীভাবে নির্ভরশীল নির্দেশিকার নিয়ামকের মধ্যে প্রবেশ করাতে পারে?
alockwood05

আপনি কোডপেন উদাহরণটি: আনকাডড ত্রুটি: [ject ইনজেক্টর: মডিউলার] মডিউল মাই্যাপটি কারণে ইনস্ট্যান্ট করতে ব্যর্থ হয়েছে: ত্রুটি: [ject ইনজেক্টর: আনআরপি] অজানা সরবরাহকারী: slngStylePrelinkProvider
rofrol

7
  • সংকলন : যখন আমাদের নির্দেশাবলীর টেমপ্লেটটি পরিবর্তন করতে হবে, যেমন নতুন এক্সপ্রেশন যুক্ত করতে চান, তখন এই নির্দেশকের অভ্যন্তরে অন্য একটি নির্দেশ সংযোজন করুন
  • নিয়ামক : যখন আমাদের শেয়ার / পুনঃব্যবহার $ স্কোপ ডেটা প্রয়োজন তখন ব্যবহৃত হয়
  • লিঙ্ক : এটি এমন একটি ফাংশন যা যখন আমাদের ইভেন্ট হ্যান্ডলার সংযুক্ত করতে বা ডিওএম হেরফের করতে হয় তখন ব্যবহৃত হয়।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.