AngularJS - দিকনির্দেশনায় ফাংশন পাস


160

আমি একটি উদাহরণ কৌণিক জেএস আছে

<div ng-controller="testCtrl">

<test color1="color1" updateFn="updateFn()"></test>
</div>
 <script>
  angular.module('dr', [])
.controller("testCtrl", function($scope) {
    $scope.color1 = "color";
    $scope.updateFn = function() {
        alert('123');
    }
})
.directive('test', function() {
    return {
        restrict: 'E',
        scope: {color1: '=',
                updateFn: '&'},
        template: "<button ng-click='updateFn()'>Click</button>",
        replace: true,
        link: function(scope, elm, attrs) { 
        }
    }
});

</script>
</body>

</html>

আমি চাই যখন আমি বোতামটি ক্লিক করব, সতর্কতা বাক্সটি উপস্থিত হবে, তবে কিছুই দেখাবে না।

আমাকে কি কেউ সাহায্য করতে পারবেন?

উত্তর:


243

বিচ্ছিন্ন সুযোগের নির্দেশের ভিতরে থেকে প্যারেন্ট স্কোপটিতে একটি নিয়ামক ফাংশন কল করতে dash-separated, ওপির মতো এইচটিএমএলে বৈশিষ্ট্যের নাম ব্যবহার করুন names

এছাড়াও যদি আপনি আপনার ফাংশনে একটি প্যারামিটার প্রেরণ করতে চান তবে কোনও বস্তু পেরিয়ে ফাংশনটিতে কল করুন:

<test color1="color1" update-fn="updateFn(msg)"></test>

জাতীয়

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

app.controller("testCtrl", function($scope) {
    $scope.color1 = "color";
    $scope.updateFn = function(msg) {        
        alert(msg);
    }
});

app.directive('test', function() {
    return {
        restrict: 'E',
        scope: {
            color1: '=',
            updateFn: '&'
        },
        // object is passed while making the call
        template: "<button ng-click='updateFn({msg : \"Hello World!\"})'>
            Click</button>",
        replace: true,        
        link: function(scope, elm, attrs) {             
        }
    }
});

Fiddle


1
আপনার উত্তরের জন্য কোডজিলাকে ধন্যবাদ, এবং আমি যখন পরিস্থিতি সম্পর্কে জিজ্ঞাসা করতে চাই যখন আমি "আপডেটফএন" ফাংশনটি প্যারেন্ট স্কোপ থেকে নির্দেশ "পরীক্ষায়" ফাঁক করে আলাদা করতে পারি, তখন কি সম্ভব?
ব্যবহারকারী2707026

2
replace: অ্যাট্রিবিউট AngularJS মধ্যে অবচিত হয়েছে stackoverflow.com/questions/24194972/...
cdmckay

8
কোন কারণে তর্কটি আমার পক্ষে অপরিজ্ঞাত।
chovy

1
@ শেভি আমার মনে হয় আপনি একবারে পদ্ধতিটি আবার কল করার পরে যুক্তিটি কেবলমাত্র ব্যবহৃত হবে? প্রথম উন্মুক্ত বন্ধনীর ব্যবহারটি এমন বিন্যাস হিসাবে মনে হচ্ছে যে
কৌণিকটি

1
updateFn({msg: 'my message'});নির্দেশকের linkফাংশনের অভ্যন্তরে ফাংশন কল করার সময় কোনও অবয়ব ম্যাপিং সেই বিন্যাসে ব্যবহার করতে হবে ।
ব্রায়ান

159

সম্ভবত আমি কিছু মিস করছি, তবে অন্য সমাধানগুলি প্যারেন্ট স্কোপ ফাংশনটিকে ডাকে যদিও নির্দেশিক কোড থেকে আর্গুমেন্টগুলি পাস করার কোনও ক্ষমতা নেই , উদাহরণস্বরূপ, কারণ নির্দিষ্ট পরামিতিগুলির সাথে update-fnকল করা হচ্ছে । সামান্য পরিবর্তন নির্দেশকে যুক্তিগুলি পাস করার অনুমতি দেয় যা আমি মনে করি এটি আরও বেশি কার্যকর isupdateFn(){msg: "Hello World"}

<test color1="color1" update-fn="updateFn"></test>

নোট করুন যে এইচটিএমএল কোনও ()বন্ধন ছাড়াই একটি ফাংশন রেফারেন্স পাস করছে b

জাতীয়

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

app.controller("testCtrl", function($scope) {
    $scope.color1 = "color";
    $scope.updateFn = function(msg) {        
        alert(msg);
    }
});

app.directive('test', function() {
    return {
        restrict: 'E',
        scope: {
            color1: '=',
            updateFn: '&'
        },
        // object is passed while making the call
        template: "<button ng-click='callUpdate()'>
            Click</button>",
        replace: true,        
        link: function(scope, elm, attrs) {       
          scope.callUpdate = function() {
            scope.updateFn()("Directive Args");
          }
        }
    }
});

সুতরাং উপরের অংশে, এইচটিএমএল লোকাল স্কোপ callUpdateফাংশনকে কল করছে , যা প্যারেন্ট স্কোপ থেকে আপডেটফ্যানটি 'আনয়ন' করে এবং নির্দেশটি উত্পন্ন করতে পারে এমন পরামিতিগুলির সাথে ফিরে ফাংশনটিকে কল করে।

http://jsfiddle.net/mygknek2/


9
নিশ্চিত না যে আমি কীভাবে কার্যকর এমন কোনও কাজের জন্য ডাউন ভোট পেতে পারি ?? ভোট নেমে গেলে আপনার মন্তব্য করা উচিত।
স্টিভ

7
এটি আমার পক্ষে কাজ করেছে। আপনি যদি অতিরিক্ত ফাংশনটি না চান তবে কেবল লিখুনng-click="updateFn()('Directive Args')"
গ্রাহাম ওয়াল্টার্স

7
ওহউ! স্কোপ.আপডেটএফএন () ("দিকনির্দেশক আরগস"); !! না স্কোপ.আপডেটএফএন ("দিকনির্দেশক আরগস"); !!!
ফুং ডি একটি

2
এটি প্রকৃতপক্ষে আরও নিখুঁত উত্তর !!
ভিনিশ

11
@ লুড্বিক ১১ নিশ্চিত - এর কারণ স্কুপ.আপডেটফএন যখন এর মতো সংজ্ঞায়িত করা হয় তখন একটি ফাংশন যা কোনও ফাংশন দেয় (তাই () ()) এবং এটি কারণ আমরা স্কোপে (এইচটিএমএল-আপডেট-এফএন = "আপডেটএফএন" এর মাধ্যমে) একটি রেফারেন্স পাস করি) আমরা কল করতে চান ফাংশন। 1 ম () হ'ল এই রেফারেন্সটি ফেরত দেওয়ার জন্য কৌনিকের কাছে একটি কল, ২ য় () আমাদের ফাংশনে কল করে এবং যেখানে আমরা কোনও পরামিতিগুলি পাস করি। এইচটিএইচ
স্টিভ

39

আপনার 'পরীক্ষার' নির্দেশনা এইচটিএমএল ট্যাগে, ফাংশনটির গুণাবলীর নামটি উটকেসেড হওয়া উচিত নয় , তবে ড্যাশ-ভিত্তিক হওয়া উচিত

সুতরাং - পরিবর্তে:

<test color1="color1" updateFn="updateFn()"></test>

লিখুন:

<test color1="color1" update-fn="updateFn()"></test>

নির্দেশক বৈশিষ্ট্যগুলির মধ্যে পার্থক্য জানানোর এটি কৌণিকর উপায় (যেমন আপডেট-এফএন ফাংশন) এবং ফাংশন।


1
ধরার জন্য ধন্যবাদ আমি আমার উত্তরে এটি অন্তর্ভুক্ত করেছি। ভোট দিয়েছেন! :)
সর্বদা আধ্যাত্মিক

10

দ্বি নির্দেশমূলক বাঁধাইয়ের সাথে নিয়ন্ত্রণকারী ফাংশনটি কীভাবে পাশ করা যায় ? তারপরে আপনি এটিকে নিয়মিত টেমপ্লেটের মতো ঠিক একইভাবে নির্দেশিকায় ব্যবহার করতে পারেন (সরলতার জন্য আমি অপ্রাসঙ্গিক অংশগুলি ছিটিয়েছি):

<div ng-controller="testCtrl">

   <!-- pass the function with no arguments -->
   <test color1="color1" update-fn="updateFn"></test>
</div>

<script>
   angular.module('dr', [])
   .controller("testCtrl", function($scope) {
      $scope.updateFn = function(msg) {
         alert(msg);
      }
   })
   .directive('test', function() {
      return {
         scope: {
            updateFn: '=' // '=' bidirectional binding
         },
         template: "<button ng-click='updateFn(1337)'>Click</button>"
      }
   });
</script>

আমি এই প্রশ্নে অবতরণ করেছি, কারণ আমি আগুনের উপরের পদ্ধতিটি চেষ্টা করেছি, তবে কোনওভাবে এটি কার্যকর হয়নি। এখন এটি পুরোপুরি কাজ করে।


5

অ্যাট্রিবিউট নামের জন্য ড্যাশ এবং লোয়ার কেস ব্যবহার করুন (অন্যান্য উত্তরগুলির মতো বলেছেন):

 <test color1="color1" update-fn="updateFn()"></test>

এবং নির্দেশের সুযোগে "&" এর পরিবর্তে "=" ব্যবহার করুন:

 scope: { updateFn: '='}

তারপরে আপনি অন্য ফাংশনের মতো আপডেটফেন ব্যবহার করতে পারেন:

 <button ng-click='updateFn()'>Click</button>

এই নাও!


5
আপনি কেন 'ও' এর পরিবর্তে '=' ব্যবহার করবেন? যখন আমি এটি চেষ্টা করেছিলাম এটি বার বার আমার ফাংশনটি কল করে।
ব্যবহারকারী 1012500

2
এটির জন্য '=' ব্যবহার করা ভুল। এটি দ্বিমুখী অবজেক্ট বাইন্ডিংয়ের জন্য।
বেন টালিডিয়োরোস

1
আমি মনে করি, প্রথম টেম্পলেটটিতে প্রথম বন্ধনীর ব্যবহার একমাত্র সমস্যা। এটি কার্য সম্পাদন করে তারপরে ফলাফলকে আবদ্ধ করে। পরিবর্তে আপনার এই ফাংশনটির নামটি অবশ্যই পাস করা উচিত:update-fn="updateFn"
মার্টন ট্যামস

1
খারাপ উত্তর। খুব খারাপ.
1:37

4

আমাকে "&" এর পরিবর্তে "=" বাইন্ডিং ব্যবহার করতে হয়েছিল কারণ এটি কাজ করে না। অদ্ভুত আচরণ.


2
এর কারণ আপনি সম্ভবত মৃত্যুদন্ড কার্যকর করার পরিবর্তে জেএস ফাংশন রেফারেন্সটি পাস করছেন। আপনি যখন নির্দেশকে যুক্তি হিসাবে ফাংশনটি পাস করেন তখন আপনাকে update-fn="updateFn()"অবশ্যই প্রথম বন্ধনী (এবং সম্ভবত প্যারাম) অন্তর্ভুক্ত করতে হবে। এটি কোনও ফাংশন রেফারেন্স হিসাবে পাস করা বাইন্ডিংয়ের update-fn="updateFn"সাথে কাজ করবে না&
জর্জিজিআরসি

0

@ জর্জেজিআরসি আপনার উত্তরের জন্য ধন্যবাদ। যদিও একটি জিনিস, "সম্ভবত" অংশটি খুব গুরুত্বপূর্ণ। আপনি প্যারামিটার (গুলি) আছে, তাহলে আপনি আপনার টেমপ্লেট হিসাবে ভাল অন্তর্ভুক্ত করা আবশ্যক এটা / তাদের এবং আপনার উল্লেখ নিশ্চিত করা স্থানীয়দের যেমন updateFn({msg: "Directive Args"}

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