বরং কেবল কোনও ব্যাখ্যা ছাড়াই "হ্যাঁ" এবং "না" দিয়ে টেবিলটি পূরণ করুন, আমি আরও কিছুটা বিশদে যাব।
[দ্রষ্টব্য, সমাপ্তির পরে যুক্ত: এটি শেষ হয়েছে ... আমার প্রত্যাশার চেয়ে কিছুটা দীর্ঘ। নীচে একটি টিএল; ড, তবে আমি আশা করি এটি তথ্যযুক্ত প্রমাণিত হবে]]
[অ্যাঙ্গুলারজেএস উইকিতে এই উত্তরটি যুক্ত করা হয়েছে: নির্ভরতা ইনজেকশন বোঝা ]
$provide
সেবা কৌণিক কহন নতুন ইঞ্জেকশনভিত্তিক জিনিস তৈরি করার জন্য দায়ী; এই জিনিসগুলিকে পরিষেবা বলা হয় । পরিষেবাদি সরবরাহকারী নামক জিনিস দ্বারা সংজ্ঞায়িত করা হয় , যা আপনি যখন ব্যবহার করবেন তখন তৈরি করছেন $provide
। কোনও সরবরাহকারীর সংজ্ঞা দেওয়া সেবার provider
পদ্ধতির মাধ্যমে করা হয় $provide
এবং আপনি $provide
কোনও অ্যাপ্লিকেশনটির config
কার্যক্রমে ইনজেকশনের জন্য অনুরোধ করে পরিষেবাটি ধরে রাখতে পারেন । উদাহরণ হতে পারে এরকম কিছু হতে পারে:
app.config(function($provide) {
$provide.provider('greeting', function() {
this.$get = function() {
return function(name) {
alert("Hello, " + name);
};
};
});
});
এখানে আমরা একটি পরিষেবার জন্য একটি নতুন সরবরাহকারী সংজ্ঞায়িত করেছি greeting
; আমরা greeting
কোনও ইনজেক্টেবল ফাংশনে (যেমন নিয়ামকগুলির মতো আরও পরে) নামকরণে একটি ভেরিয়েবল ইনজেক্ট করতে পারি এবং কৌনিকটি $get
পরিষেবাটির নতুন উদাহরণ ফেরত দেওয়ার জন্য সরবরাহকারীর ফাংশনটিকে কল করবে । এই ক্ষেত্রে, যে জিনিসটি ইনজেকশন দেওয়া হবে তা হ'ল একটি ফাংশন যা নামের উপর ভিত্তি করে একটি name
পরামিতি নেয় এবং alert
সা বার্তা নেয় । আমরা এটি এর মতো ব্যবহার করতে পারি:
app.controller('MainController', function($scope, greeting) {
$scope.onClick = function() {
greeting('Ford Prefect');
};
});
এখন কৌশলটি এখানে। factory
, service
এবং value
সমস্ত সরবরাহকারীর বিভিন্ন অংশ সংজ্ঞায়িত করার জন্য কেবলমাত্র শর্টকাট - অর্থাৎ, তারা সমস্ত স্টাফ আউট না করে সরবরাহকারীকে সংজ্ঞায়নের একটি মাধ্যম সরবরাহ করে provide উদাহরণস্বরূপ, আপনি ঠিক ঠিক একই সরবরাহকারীর মতো লিখতে পারেন:
app.config(function($provide) {
$provide.factory('greeting', function() {
return function(name) {
alert("Hello, " + name);
};
});
});
এটি বোঝা গুরুত্বপূর্ণ, সুতরাং আমি পুনরায় জবাব দেব: হুডের নীচে, AngularJS আমাদের জন্য উপরে বর্ণিত ঠিক একই কোডটি ( $provide.provider
সংস্করণ) কল করছে । আক্ষরিক অর্থে, দুটি সংস্করণে 100% পার্থক্য নেই। value
ঠিক একইভাবে কাজ করে - যদি আমরা আমাদের $get
ফাংশন থেকে ফিরে যাই যাইব (ওরফে আমাদের factory
ফাংশন) সর্বদা ঠিক একই হয়, আমরা আরও কম কোড ব্যবহার করে লিখতে পারি value
। উদাহরণস্বরূপ, যেহেতু আমরা সর্বদা আমাদের greeting
পরিষেবার জন্য একই ফাংশনটি ফিরিয়ে দিই, আমরা value
এটির সংজ্ঞা দিতেও ব্যবহার করতে পারি:
app.config(function($provide) {
$provide.value('greeting', function(name) {
alert("Hello, " + name);
});
});
আবার, আমরা এই ফাংশনটি সংজ্ঞায়িত করতে ব্যবহৃত দুটি অন্যান্য পদ্ধতির সাথে এটি একইরকম 100% - এটি কিছু টাইপিং সংরক্ষণের উপায়।
এখন আপনি সম্ভবত লক্ষ্য করেছেন app.config(function($provide) { ... })
যে আমি এই বিরক্তিকর জিনিসটি ব্যবহার করছি। নতুন প্রদানকারীর সংজ্ঞা (মাধ্যমে যেহেতু কোনো দেওয়া উপরোক্ত পদ্ধতি) যাতে সাধারণ, AngularJS অনাবৃত হল $provider
পদ্ধতি সরাসরি মডিউলে বস্তুর উপর আরও টাইপিং সংরক্ষণ করতে:
var myMod = angular.module('myModule', []);
myMod.provider("greeting", ...);
myMod.factory("greeting", ...);
myMod.value("greeting", ...);
এগুলি app.config(...)
আমরা আগের মতো আরও ভার্বোজ সংস্করণগুলির মতো একই কাজ করে ।
এখন পর্যন্ত যে একটি ইনজেকশন ছাড়তে পেরেছি তা হ'ল constant
। এখনকার জন্য, এটা সহজ যথেষ্ট যে এটা ঠিক মত কাজ করে বলে এর value
। আমরা পরে একটি পার্থক্য দেখতে পাবেন।
পর্যালোচনা করতে , কোডের এই সমস্ত টুকরা ঠিক একই জিনিস করছে:
myMod.provider('greeting', function() {
this.$get = function() {
return function(name) {
alert("Hello, " + name);
};
};
});
myMod.factory('greeting', function() {
return function(name) {
alert("Hello, " + name);
};
});
myMod.value('greeting', function(name) {
alert("Hello, " + name);
});
ইনজেক্টরটি আমাদের মাধ্যমে প্রদত্ত কোডটি ব্যবহার করে আমাদের পরিষেবাগুলির উদাহরণগুলি তৈরি করার জন্য দায়ী $provide
(কোনও পাং উদ্দেশ্যে নয়)। যে কোনও সময় আপনি কোনও ফাংশন লিখেন যা ইনজেকশনের যুক্তিগুলি নিয়ে থাকে, আপনি কর্মক্ষেত্রে ইনজেক্টরটি দেখছেন। প্রতিটি অ্যাঙ্গুলারজেএস অ্যাপ্লিকেশনটির একটি একক থাকে $injector
যা অ্যাপ্লিকেশন প্রথম শুরু হওয়ার সাথে সাথে তৈরি হয়; আপনি যে $injector
কোনও ইনজেক্টেবল ফাংশনে ইনজেকশনের মাধ্যমে এটিকে ধরে রাখতে পারবেন (হ্যাঁ, $injector
কীভাবে নিজেকে ইনজেক্ট করতে হয় জানেন!)
একবার আপনার হয়ে গেলে $injector
, আপনি পরিষেবার get
নাম দিয়ে কল করে কোনও সংজ্ঞায়িত পরিষেবার উদাহরণ পেতে পারেন । উদাহরণ স্বরূপ,
var greeting = $injector.get('greeting');
greeting('Ford Prefect');
ইনজেকশনরের কাজগুলিতে ইনজেকশন দেওয়ার জন্যও দায়বদ্ধ; উদাহরণস্বরূপ, আপনি ইনজেক্টরের invoke
পদ্ধতিটি ব্যবহার করে যে কোনও ফাংশনে যাদুতে পরিষেবা ইনজেক্ট করতে পারেন ;
var myFunction = function(greeting) {
greeting('Ford Prefect');
};
$injector.invoke(myFunction);
এটি লক্ষণীয় যে ইনজেক্টর কেবল একবারই কোনও পরিষেবার উদাহরণ তৈরি করবে । এটি পরিষেবা সরবরাহকারীর নামে যা কিছু ফিরিয়ে দেয় তা ক্যাশে করে; পরের বার আপনি পরিষেবার জন্য জিজ্ঞাসা করবেন, আপনি আসলে একই একই অবজেক্ট পাবেন।
সুতরাং, আপনার প্রশ্নের উত্তর দেওয়ার জন্য, আপনি যে কোনও ক্রিয়াকলাপের সাথে$injector.invoke
ডাকার জন্য পরিষেবাগুলি ইনজেক্ট করতে পারেন । এটা অন্তর্ভুক্ত
- নিয়ামক সংজ্ঞা ফাংশন
- নির্দেশিক সংজ্ঞা ফাংশন
- ফিল্টার সংজ্ঞা ফাংশন
$get
প্রদানকারীর পদ্ধতি (ওরফে factory
সংজ্ঞা ফাংশন)
যেহেতু constant
এস এবং value
এস সর্বদা একটি স্থিতিশীল মান ফেরত দেয়, তাই সেগুলি ইনজেক্টারের মাধ্যমে ডাকা হয় না এবং সুতরাং আপনি এগুলি কোনও কিছুর সাথে ইনজেকশন করতে পারবেন না।
সরবরাহকারীদের কনফিগার করা হচ্ছে
আপনি হতাশ হতে পারে কেন কারো সাথে একটি পূর্ণাঙ্গ প্রদানকারী সেট আপ করার জন্য বিরক্ত করবে provide
পদ্ধতি যদি factory
, value
, ইত্যাদি এত সহজ হয়। উত্তরটি হ'ল সরবরাহকারীরা প্রচুর কনফিগারেশন মঞ্জুরি দেয়। আমরা ইতিমধ্যে উল্লেখ করেছি যে আপনি যখন সরবরাহকারীর মাধ্যমে কোনও পরিষেবা তৈরি করেন (বা কোনও শর্টকাট অ্যাঙ্গুলার আপনাকে দেয়), আপনি একটি নতুন সরবরাহকারী তৈরি করেন যা পরিষেবাটি কীভাবে নির্মিত তা নির্ধারণ করে। আমি যা উল্লেখ করি নি তা হ'ল এই সরবরাহকারীগুলিকে config
আপনার অ্যাপ্লিকেশনের অংশগুলিতে ইনজেকশন দেওয়া যেতে পারে যাতে আপনি তাদের সাথে যোগাযোগ করতে পারেন!
প্রথমে, কৌণিক আপনার অ্যাপ্লিকেশনটি দ্বি-পর্যায়ে - দফায় config
এবং run
পর্যায়ক্রমে চালায় । config
ফেজ, আমরা দেখা করেছি হিসাবে, আপনি প্রয়োজনীয় যে কোন প্রদানকারীর সেট আপ করতে পারেন যেখানে হয়। এটি এখানেই নির্দেশিকা, নিয়ন্ত্রণকারী, ফিল্টার এবং এর মতো সেট আপ হয়। run
ফেজ, যেমন আপনি অনুমান করতে পারে, যেখানে কৌণিক আসলে আপনার DOM প্রনয়ন এবং আপনার অ্যাপ্লিকেশন চালু হয়।
আপনি এই ধাপগুলিতে myMod.config
এবং myMod.run
ফাংশনগুলির সাথে চালানোর জন্য অতিরিক্ত কোড যুক্ত করতে পারেন - প্রত্যেকে সেই নির্দিষ্ট পর্যায়ে চলতে কোনও ফাংশন নেয়। যেমন আমরা প্রথম বিভাগে দেখেছি, এই ফাংশনগুলি ইনজেকশনযোগ্য - আমরা $provide
আমাদের প্রথম কোডের নমুনায় অন্তর্নির্মিত পরিষেবাটি ইনজেকশন দিয়েছি । তবে, লক্ষ্য করার মতো বিষয় হল এই config
ধাপের সময় কেবল সরবরাহকারীদেরই ইনজেকশন দেওয়া যায় ( AUTO
মডিউলটিতে থাকা পরিষেবাদি বাদে - $provide
এবং $injector
)।
উদাহরণস্বরূপ, নিম্নলিখিত অনুমোদিত নয় :
myMod.config(function(greeting) {
// WON'T WORK -- greeting is an *instance* of a service.
// Only providers for services can be injected in config blocks.
});
তুমি কি কি করতে কোনো হয় এক্সেস আছে প্রদানকারীর পরিষেবার জন্য আপনার তৈরি করা করেছি:
myMod.config(function(greetingProvider) {
// a-ok!
});
একটি গুরুত্বপূর্ণ ব্যতিক্রম রয়েছে: constant
গুলি, যেহেতু সেগুলি পরিবর্তন করা যায় না, তাদের config
ব্লকের ভিতরে ইঞ্জেকশন দেওয়ার অনুমতি দেওয়া হয় (এটি সেগুলির চেয়ে পৃথক কীভাবে value
)। তারা একা তাদের নামে অ্যাক্সেস করা হয়েছে ( Provider
প্রত্যয় প্রয়োজন নেই)।
আপনি যখনই কোনও পরিষেবার জন্য সরবরাহকারীকে সংজ্ঞায়িত করেন, সেই সরবরাহকারীর নাম হয়, পরিষেবার নাম serviceProvider
কোথায় service
। এখন আমরা সরবরাহকারীর শক্তি আরও কিছু জটিল জিনিস করতে পারি!
myMod.provider('greeting', function() {
var text = 'Hello, ';
this.setText = function(value) {
text = value;
};
this.$get = function() {
return function(name) {
alert(text + name);
};
};
});
myMod.config(function(greetingProvider) {
greetingProvider.setText("Howdy there, ");
});
myMod.run(function(greeting) {
greeting('Ford Prefect');
});
এখন আমাদের সরবরাহকারীটির একটি ফাংশন রয়েছে setText
যা আমরা আমাদের কাস্টমাইজ করতে ব্যবহার করতে পারি alert
; config
এই পদ্ধতিটি কল করতে এবং পরিষেবাটি কাস্টমাইজ করার জন্য আমরা এই সরবরাহকারীর অ্যাক্সেস পেতে পারি । অবশেষে আমরা যখন আমাদের অ্যাপ্লিকেশনটি চালিত করি তখন আমরা greeting
পরিষেবাটি দখল করতে পারি এবং আমাদের কাস্টমাইজেশন কার্যকর হয়েছে কিনা তা দেখতে চেষ্টা করে দেখতে পারি।
যেহেতু এটি একটি আরো জটিল উদাহরণ, এখানে কাজ বিক্ষোভের আছে: http://jsfiddle.net/BinaryMuse/9GjYg/
কন্ট্রোলার ফাংশনগুলিতে ইনজেকশন দেওয়া যেতে পারে তবে কন্ট্রোলাররা নিজেরাই অন্য জিনিসগুলিতে ইনজেকশনের ব্যবস্থা করতে পারে না। এটি কারণ যে নিয়ন্ত্রক সরবরাহকারীর মাধ্যমে তৈরি হয় না। পরিবর্তে, একটি অন্তর্নির্মিত কৌণিক পরিষেবা রয়েছে যা $controller
আপনার নিয়ামকগুলি সেট আপ করার জন্য দায়ী। আপনি যখন কল করবেন তখন আপনি শেষ বিভাগের মতোই এই পরিষেবাটির সরবরাহকারীকেmyMod.controller(...)
অ্যাক্সেস করছেন ।
উদাহরণস্বরূপ, আপনি যখন এই জাতীয় নিয়ামক নির্ধারণ করেন:
myMod.controller('MainController', function($scope) {
// ...
});
আপনি আসলে যা করছেন তা হ'ল:
myMod.config(function($controllerProvider) {
$controllerProvider.register('MainController', function($scope) {
// ...
});
});
পরবর্তীতে, যখন কৌনিকটি আপনার নিয়ামকের একটি উদাহরণ তৈরি করার দরকার পরে এটি $controller
পরিষেবাটি ব্যবহার করে (যার $injector
ফলে এটি আপনার নিয়ামক ফাংশনটি আহ্বান করতে ব্যবহার করে যাতে এটির নির্ভরতাও ইঞ্জেকশন পায়)।
ফিল্টার এবং নির্দেশিকা
filter
এবং directive
ঠিক ঠিক একইভাবে কাজ controller
; filter
কল করা পরিষেবা $filter
এবং তার সরবরাহকারী ব্যবহার করে $filterProvider
, যখন কল directive
করা পরিষেবা $compile
এবং তার সরবরাহকারী ব্যবহার করে $compileProvider
। কিছু লিঙ্ক:
অন্যান্য উদাহরণ অনুসারে myMod.filter
এবং myMod.directive
এই পরিষেবাদিগুলি কনফিগার করার শর্টকাট।
সুতরাং, সংক্ষেপে বলতে $injector.invoke
গেলে যে কোনও ক্রিয়াকলাপের সাথে ডাকা হয় তা ইনজেকশন দেওয়া যায় । এটি আপনার চার্ট থেকে অন্তর্ভুক্ত রয়েছে (তবে সীমাবদ্ধ নয়):
- নিয়ামক
- নির্দেশ
- কারখানা
- ছাঁকনি
- সরবরাহকারী
$get
(যখন কোনও বিষয় সরবরাহকারীকে সংজ্ঞায়িত করার সময়)
- সরবরাহকারী ফাংশন (কনস্ট্রাক্টর ফাংশন হিসাবে প্রদানকারীর সংজ্ঞা দেওয়ার সময়)
- সেবা
সরবরাহকারী এমন নতুন পরিষেবা তৈরি করে যা জিনিসগুলিতে ইনজেকশনের ব্যবস্থা করা যায় । এটা অন্তর্ভুক্ত:
- ধ্রুব
- কারখানা
- প্রদানকারী
- সেবা
- মান
এটি বলেছিল, অন্তর্নির্মিত পরিষেবাদি পছন্দ করে $controller
এবং ইনজেকশনের ব্যবস্থা করা $filter
যেতে পারে এবং আপনি সেই পরিষেবাগুলি সেই নতুন পদ্ধতিগুলির সাথে সংজ্ঞায়িত নতুন ফিল্টার এবং নিয়ন্ত্রককে ধরে রাখতে ব্যবহার করতে পারেন (যদিও আপনি সংজ্ঞায়িত জিনিসগুলি নিজের দ্বারা নয়, সক্ষম হতে পারবেন) জিনিস ইনজেকশনের)।
এর বাইরে, কোনও ইনজেক্টর-চালিত ফাংশন যে কোনও সরবরাহকারী সরবরাহিত পরিষেবার সাথে ইনজেকশন দেওয়া যায় - কোনও সীমাবদ্ধতা নেই ( এখানে তালিকাভুক্ত config
ও run
পার্থক্য বাদে)।