অ্যাঙ্গুলার.জেএস-এ অন্যদের মধ্যে কোন "জিনিসগুলি" ইনজেকশন দেওয়া যেতে পারে?


142

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

আমি আসলে যা খুঁজছি তা হল এই টেবিলটি y / n দিয়ে পূর্ণ filled একই সারি / কলামযুক্ত কক্ষগুলির জন্য, এর অর্থ একটি "টাইপ" এর মান একই "টাইপ" দিয়ে অন্য একটিতে ইনজেক্ট করা

+----------------+----------+------------+-----------+---------+--------+----------+---------+-------+
| Can we inject? | Constant | Controller | Directive | Factory | Filter | Provider | Service | Value |
+----------------+----------+------------+-----------+---------+--------+----------+---------+-------+
| Constant       |          |            |           |         |        |          |         |       |
| Controller     |          |            |           |         |        |          |         |       |
| Directive      |          |            |           |         |        |          |         |       |
| Factory        |          |            |           |         |        |          |         |       |
| Filter         |          |            |           |         |        |          |         |       |
| Provider       |          |            |           |         |        |          |         |       |
| Service        |          |            |           |         |        |          |         |       |
| Value          |          |            |           |         |        |          |         |       |
+----------------+----------+------------+-----------+---------+--------+----------+---------+-------+

প্রতিক্রিয়াগুলি এখানে ডকস.আঙ্গুলারজেএস.আর.গাইড
প্রোভাইডার্স

উত্তর:


391

বরং কেবল কোনও ব্যাখ্যা ছাড়াই "হ্যাঁ" এবং "না" দিয়ে টেবিলটি পূরণ করুন, আমি আরও কিছুটা বিশদে যাব।

[দ্রষ্টব্য, সমাপ্তির পরে যুক্ত: এটি শেষ হয়েছে ... আমার প্রত্যাশার চেয়ে কিছুটা দীর্ঘ। নীচে একটি টিএল; ড, তবে আমি আশা করি এটি তথ্যযুক্ত প্রমাণিত হবে]]

[অ্যাঙ্গুলারজেএস উইকিতে এই উত্তরটি যুক্ত করা হয়েছে: নির্ভরতা ইনজেকশন বোঝা ]


সরবরাহকারী ( $provide)

$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);
});

ইনজেক্টর ( $injector)

ইনজেক্টরটি আমাদের মাধ্যমে প্রদত্ত কোডটি ব্যবহার করে আমাদের পরিষেবাগুলির উদাহরণগুলি তৈরি করার জন্য দায়ী $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)

কন্ট্রোলার ফাংশনগুলিতে ইনজেকশন দেওয়া যেতে পারে তবে কন্ট্রোলাররা নিজেরাই অন্য জিনিসগুলিতে ইনজেকশনের ব্যবস্থা করতে পারে না। এটি কারণ যে নিয়ন্ত্রক সরবরাহকারীর মাধ্যমে তৈরি হয় না। পরিবর্তে, একটি অন্তর্নির্মিত কৌণিক পরিষেবা রয়েছে যা $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এই পরিষেবাদিগুলি কনফিগার করার শর্টকাট।


TL; ড

সুতরাং, সংক্ষেপে বলতে $injector.invoke গেলে যে কোনও ক্রিয়াকলাপের সাথে ডাকা হয় তা ইনজেকশন দেওয়া যায় । এটি আপনার চার্ট থেকে অন্তর্ভুক্ত রয়েছে (তবে সীমাবদ্ধ নয়):

  • নিয়ামক
  • নির্দেশ
  • কারখানা
  • ছাঁকনি
  • সরবরাহকারী $get(যখন কোনও বিষয় সরবরাহকারীকে সংজ্ঞায়িত করার সময়)
  • সরবরাহকারী ফাংশন (কনস্ট্রাক্টর ফাংশন হিসাবে প্রদানকারীর সংজ্ঞা দেওয়ার সময়)
  • সেবা

সরবরাহকারী এমন নতুন পরিষেবা তৈরি করে যা জিনিসগুলিতে ইনজেকশনের ব্যবস্থা করা যায় । এটা অন্তর্ভুক্ত:

  • ধ্রুব
  • কারখানা
  • প্রদানকারী
  • সেবা
  • মান

এটি বলেছিল, অন্তর্নির্মিত পরিষেবাদি পছন্দ করে $controllerএবং ইনজেকশনের ব্যবস্থা করা $filter যেতে পারে এবং আপনি সেই পরিষেবাগুলি সেই নতুন পদ্ধতিগুলির সাথে সংজ্ঞায়িত নতুন ফিল্টার এবং নিয়ন্ত্রককে ধরে রাখতে ব্যবহার করতে পারেন (যদিও আপনি সংজ্ঞায়িত জিনিসগুলি নিজের দ্বারা নয়, সক্ষম হতে পারবেন) জিনিস ইনজেকশনের)।

এর বাইরে, কোনও ইনজেক্টর-চালিত ফাংশন যে কোনও সরবরাহকারী সরবরাহিত পরিষেবার সাথে ইনজেকশন দেওয়া যায় - কোনও সীমাবদ্ধতা নেই ( এখানে তালিকাভুক্ত configrunপার্থক্য বাদে)।


6
কি দারুন! এই ধরনের বিবরণে উত্তর দেওয়ার জন্য আপনাকে ধন্যবাদ! আমি এটি দু'বার পড়েছি এবং আমি মনে করি আমি কিছুটা বুঝতে পেরেছি। এটি পরবর্তীতে আর আপনি যে লিঙ্কগুলি দিয়েছিলেন তা অধ্যয়ন করবে। এবং বিড়ালের জন্য অন্য একটি +1। :)
ব্যবহারকারী 1527166

18
আমি এসেছি সবচেয়ে দরকারী এবং বিস্তারিত এসও উত্তরগুলির মধ্যে একটি - ধন্যবাদ!
গড্ডার্স

11
এই উত্তরটি দুর্দান্ত স্তরের এক দুর্দান্ত স্তরকে সংজ্ঞায়িত করে। আলোকসজ্জা স্টাফ।
এনগুরে নাইগা

4
এখন পর্যন্ত আমি অ্যাঙ্গুলারজেএস-এর জন্য সেরা উত্স পেয়েছি across ধন্যবাদ।
90

5
আক্ষরিকভাবে আমি দেখেছি AngularJS ডকুমেন্টেশন সেরা টুকরা। যাওয়ার পথে!
আইয়ান ডানকান

13

বাইনারিউজ প্রদানকারীর, কারখানাগুলি এবং পরিষেবাগুলি সম্পর্কে তার আশ্চর্যজনক উত্তরটিতে যে বিষয়টি তোলে তা হ'ল গুরুত্বপূর্ণ।

নীচে একটি চিত্র যা আমি মনে করি তার দৃষ্টিভঙ্গি দৃশ্যত চিত্রিত করতে পারে:

এঙ্গুলারজেএস তারা সকলেই কেবল সরবরাহকারী
(উত্স: সরলগুডকোড.কম )


7

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

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


দেখে মনে হচ্ছে যে নির্দেশটি সাজানোর জন্য দ্বিতীয় উদাহরণটি কৌনিক 1.4 থেকে কার্যকর হয় না। ( সেখানে জুয়ান বিস্কায়ার মন্তব্য দেখুন )
ভাদোরকোয়েস্ট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.