আচরণের বনাম পর্যবেক্ষণযোগ্য?


690

আমি কৌনিক আরএক্সজেএস নিদর্শনগুলিতে যাচ্ছি এবং আমি একটি BehaviorSubjectএবং একটি এর মধ্যে পার্থক্য বুঝতে পারি না Observable

আমার বোধগম্যতা থেকে, একটি BehaviorSubjectহ'ল একটি মান যা সময়ের সাথে সাথে পরিবর্তন করতে পারে (সাবস্ক্রাইব হতে পারে এবং গ্রাহকরা আপডেট হওয়া ফলাফলগুলি পেতে পারেন)। এটি একটি এর ঠিক একই উদ্দেশ্য বলে মনে হচ্ছে Observable

আপনি কখন একটি Observableবনাম ক ব্যবহার করবেন BehaviorSubject? BehaviorSubjectওভার ওভার Observableবা তার বিপরীতে ব্যবহার করার সুবিধা রয়েছে কি ?

উত্তর:


969

বিহেভিয়ারসুবজেক্ট এক প্রকারের বিষয়, একটি বিষয় একটি বিশেষ ধরণের পর্যবেক্ষণযোগ্য যাতে আপনি অন্য কোনও পর্যবেক্ষণযোগ্য মত বার্তায় সাবস্ক্রাইব করতে পারেন। আচরণের সাবজেক্টের অনন্য বৈশিষ্ট্যগুলি হ'ল:

  • এটির একটি প্রাথমিক মান প্রয়োজন কারণ এটি সর্বদা সাবস্ক্রিপশনে একটি মান প্রদান করতে হবে এমনকি যদি এটি কোনও না পেয়ে থাকে next()
  • সাবস্ক্রিপশনের পরে, এটি বিষয়ের শেষ মানটি প্রদান করে। একটি নিয়মিত পর্যবেক্ষণযোগ্য কেবল তখনই ট্রিগার হয় যখন এটি প্রাপ্ত হয়onnext
  • যে কোনও মুহুর্তে, আপনি getValue()পদ্ধতিটির ব্যবহার না করে পর্যবেক্ষণযোগ্য কোডে বিষয়ের শেষ মানটি পুনরুদ্ধার করতে পারেন ।

পর্যবেক্ষণযোগ্যের তুলনায় কোনও বিষয়ের অনন্য বৈশিষ্ট্যগুলি হ'ল:

  • এটি পর্যবেক্ষক হওয়ার পাশাপাশি একটি পর্যবেক্ষক যাতে আপনি এটিতে সাবস্ক্রাইব করার পাশাপাশি কোনও বিষয়ে মানও পাঠাতে পারেন।

এছাড়াও, আপনি asObservable()পদ্ধতিটি ব্যবহার করে আচরণের বিষয় থেকে একটি পর্যবেক্ষণযোগ্য পেতে পারেন BehaviorSubject

পর্যবেক্ষণযোগ্য একটি জেনেরিক, এবং BehaviorSubjectপ্রযুক্তিগতভাবে এটি পর্যবেক্ষনের একটি উপ-ধরণের কারণ আচরণগত বিষয় নির্দিষ্ট গুণাবলী সহ একটি পর্যবেক্ষণযোগ্য।

আচরণের সাথে উদাহরণ :

// Behavior Subject

// a is an initial value. if there is a subscription 
// after this, it would get "a" value immediately
let bSubject = new BehaviorSubject("a"); 

bSubject.next("b");

bSubject.subscribe(value => {
  console.log("Subscription got", value); // Subscription got b, 
                                          // ^ This would not happen 
                                          // for a generic observable 
                                          // or generic subject by default
});

bSubject.next("c"); // Subscription got c
bSubject.next("d"); // Subscription got d

নিয়মিত বিষয় সহ 2 উদাহরণ:

// Regular Subject

let subject = new Subject(); 

subject.next("b");

subject.subscribe(value => {
  console.log("Subscription got", value); // Subscription wont get 
                                          // anything at this point
});

subject.next("c"); // Subscription got c
subject.next("d"); // Subscription got d

পর্যবেক্ষণযোগ্য Subjectএবং BehaviorSubjectব্যবহার উভয় থেকেই তৈরি করা যেতে পারে subject.asObservable()

পার্থক্য কেবলমাত্র আপনি next()পদ্ধতিটি ব্যবহার করে পর্যবেক্ষণযোগ্যতে মান প্রেরণ করতে পারবেন না ।

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


7
নিয়মিত বিষয়ের উদাহরণ 2 নিয়ে আমি কিছুটা বিভ্রান্ত হয়ে পড়েছি। সাবস্ক্রিপশনটি দ্বিতীয় লাইনে আপনি সাবজেক্ট. এনেক্সট ("বি") ব্যবহার করে সাবজেক্টে পাঠানো দ্বিতীয় লাইনেও কিছু পাবে না কেন?
jmod999

25
@ jmod999 দ্বিতীয় উদাহরণটি নিয়মিত বিষয় যা সাবস্ক্রিপশন বলার আগেই একটি মান পায়। নিয়মিত বিষয়ে সাবস্ক্রিপশন বলার পরে প্রাপ্ত মানগুলির জন্য সাবস্ক্রিপশনটি কেবল ট্রিগার করা হয়। যেহেতু একটি সাবস্ক্রিপশনের ঠিক আগে পেয়েছে তাই এটি সাবস্ক্রিপশনে প্রেরণ করা হয় না।
শান্তনু ভাদোরিয়া

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

8
বুধবার আমার একটি কৌণিক 4 সাক্ষাত্কার হয়েছিল। যেহেতু আমি এখনও নতুন প্ল্যাটফর্ম শিখছি, তিনি আমাকে "আমাকে যদি এমন কোনও মডিউলে সাবস্ক্রাইব করে সাবস্ক্রাইব করে রাখেন যা এখনও অলস-বোঝা হয়নি?" আমি নিশ্চিত ছিলাম না, তবে তিনি আমাকে বলেছিলেন যে উত্তরটি একটি BSubject ব্যবহার করা ছিল - ঠিক কীভাবে মিঃ ভাদোরিয়া এটি উপরে ব্যাখ্যা করেছিলেন। উত্তরটি ছিল একটি বিএসউবজেক্ট ব্যবহার করা কারণ এটি সর্বদা সর্বশেষতম মান দেয় (কমপক্ষে সে বিষয়ে আমি সাক্ষাত্কারকারীর চূড়ান্ত মন্তব্যটি মনে করি)।
বব.মাজজো

1
@ bob.mazzo সেই মামলার জন্য আমাকে কেন একটি বিএসবজেক্ট ব্যবহার করা দরকার? - যদি আমি এই পর্যবেক্ষকটির সাবস্ক্রাইব করি তবে আমি কিছুই পাব না কারণ পর্যবেক্ষক আরম্ভ করা হয়নি কারণ এটি পর্যবেক্ষকদের কাছে ডেটা ঠেলাতে পারে না এবং যদি আমি কোনও বিএসবজেক্ট ব্যবহার করি তবে আমিও একই কারণে কিছু পাব না। উভয় ক্ষেত্রেই, গ্রাহক কোনও কিছুই গ্রহণ করতে পারবেন না কারণ মডিউলটির মধ্যে রয়েছে যা আরম্ভ করা হয়নি। আমি কি সঠিক?
রাফায়েল রেয়েস

183

পর্যবেক্ষণযোগ্য: প্রতিটি পর্যবেক্ষকের জন্য পৃথক ফলাফল

একটি খুব খুব গুরুত্বপূর্ণ পার্থক্য। যেহেতু পর্যবেক্ষণযোগ্য কেবল একটি ফাংশন, এটির কোনও রাজ্য নেই, সুতরাং প্রতিটি নতুন পর্যবেক্ষকের জন্য এটি পর্যবেক্ষণযোগ্য তৈরি কোডটি বারবার কার্যকর করে। এর ফলে:

কোডটি প্রতিটি পর্যবেক্ষকের জন্য চালিত হয়। এটি যদি এইচটিটিপি কল হয় তবে এটি প্রতিটি পর্যবেক্ষকের জন্য কল করা হবে

এর ফলে বড় বাগ এবং অদক্ষতা দেখা দেয়

বিহেভিয়ারসুবজেক্ট (বা সাবজেক্ট) পর্যবেক্ষকের বিবরণ সঞ্চয় করে, কেবল একবার কোড চালায় এবং সমস্ত পর্যবেক্ষকদের ফলাফল দেয়।

উদা:

জেএসবিন: http://jsbin.com/qowulet/edit?js,console

// --- Observable ---
let randomNumGenerator1 = Rx.Observable.create(observer => {
   observer.next(Math.random());
});

let observer1 = randomNumGenerator1
      .subscribe(num => console.log('observer 1: '+ num));

let observer2 = randomNumGenerator1
      .subscribe(num => console.log('observer 2: '+ num));


// ------ BehaviorSubject/ Subject

let randomNumGenerator2 = new Rx.BehaviorSubject(0);
randomNumGenerator2.next(Math.random());

let observer1Subject = randomNumGenerator2
      .subscribe(num=> console.log('observer subject 1: '+ num));
      
let observer2Subject = randomNumGenerator2
      .subscribe(num=> console.log('observer subject 2: '+ num));
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.5.3/Rx.min.js"></script>

আউটপুট:

"observer 1: 0.7184075243594013"
"observer 2: 0.41271850211336103"
"observer subject 1: 0.8034263165479893"
"observer subject 2: 0.8034263165479893"

Observable.createপ্রতিটি পর্যবেক্ষকের জন্য কীভাবে আলাদা আউটপুট তৈরি করা হয়েছে তা পর্যবেক্ষণ করুন তবে BehaviorSubjectসমস্ত পর্যবেক্ষকের জন্য একই আউটপুট দিয়েছেন। এটা গুরুত্বপূর্ণ.


অন্যান্য পার্থক্য সংক্ষেপে।

┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃         Observable                  ┃     BehaviorSubject/Subject         ┃      
┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ 
┃ Is just a function, no state        ┃ Has state. Stores data in memory    ┃
┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃ Code run for each observer          ┃ Same code run                       ┃
┃                                     ┃ only once for all observers         ┃
┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃ Creates only Observable             ┃Can create and also listen Observable┃
┃ ( data producer alone )             ┃ ( data producer and consumer )      ┃
┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃ Usage: Simple Observable with only  ┃ Usage:                              ┃
┃ one Obeserver.                      ┃ * Store data and modify frequently  ┃
┃                                     ┃ * Multiple observers listen to data ┃
┃                                     ┃ * Proxy between Observable  and     ┃
┃                                     ┃   Observer                          ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

3
যে কেউ আসে KnockoutJS's ko.observable()সে সাথে সাথে Rx.BehaviorSubjectতুলনা করার সাথে সাথে আরও সমান্তরালতা দেখতে পাবেনRx.Observable
সাইমন_উইভার

@ স্কিপটর পর্যবেক্ষণযোগ্য: সাবস্ক্রাইব পদ্ধতি সর্বদা পর্যবেক্ষকের সাথে যুক্ত অনেক্সট পদ্ধতিটি ট্রিগার করবে এবং ফেরতের মান আনবে। BehaviourSubject / Subject: সর্বদা প্রবাহের সর্বশেষতম মানটি ফিরিয়ে দেবে। এখানে সাবস্ক্রাইব পদ্ধতিটি সাবজেক্টের সাথে তার পর্যবেক্ষকের পরবর্তী পদ্ধতিটি ট্রিগার করবে না যতক্ষণ না এটি স্ট্রিমের সর্বশেষ মান খুঁজে পায়।
মোহন রাম

62

পর্যবেক্ষণযোগ্য এবং বিষয় উভয়ই পর্যবেক্ষণের অর্থ একটি পর্যবেক্ষক তাদের ট্র্যাক করতে পারে। তবে তাদের উভয়েরই কিছু অনন্য বৈশিষ্ট্য রয়েছে। আরও রয়েছে মোট 3 ধরণের বিষয় তাদের প্রত্যেকের আবার স্বতন্ত্র বৈশিষ্ট্য রয়েছে। তাদের প্রতিটি বোঝার চেষ্টা করি।

আপনি স্ট্যাকব্লিটজে এখানে ব্যবহারিক উদাহরণ খুঁজে পেতে পারেন । (আসল আউটপুট দেখতে আপনার কনসোলটি পরীক্ষা করা দরকার)

এখানে চিত্র বর্ণনা লিখুন

Observables

তারা শীতল: তাদের কমপক্ষে কোনও একক পর্যবেক্ষক থাকলে কোড কার্যকর হয়।

ডেটার অনুলিপি তৈরি করে: পর্যবেক্ষণযোগ্য প্রতিটি পর্যবেক্ষকের জন্য ডেটার অনুলিপি তৈরি করে।

ইউনি-দিকনির্দেশক: পর্যবেক্ষক পর্যবেক্ষণযোগ্য (উত্স / মাস্টার) এর মান নির্ধারণ করতে পারে না।

Subject

তারা গরম: কোডটি কার্যকর করা হয় এবং পর্যবেক্ষক না থাকলেও মান সম্প্রচারিত হয়।

ডেটা ভাগ করে: সমস্ত পর্যবেক্ষকের মধ্যে একই ডেটা ভাগ করা হয়।

দ্বি-দিকীয়: পর্যবেক্ষক পর্যবেক্ষণযোগ্য (উত্স / মাস্টার) এর মান নির্ধারণ করতে পারে।

যদি সাবজেক্ট ব্যবহার করে থাকে তবে আপনি পর্যবেক্ষক তৈরির আগে সম্প্রচারিত সমস্ত মান মিস করবেন। সুতরাং এখানে রিপ্লে সাবজেক্ট আসে

ReplaySubject

তারা গরম: কোডটি কার্যকর করা হয় এবং পর্যবেক্ষক না থাকলেও কোডটি সম্প্রচারিত হয়।

ডেটা ভাগ করে: সমস্ত পর্যবেক্ষকের মধ্যে একই ডেটা ভাগ করা হয়।

দ্বি-দিকীয়: পর্যবেক্ষক পর্যবেক্ষণযোগ্য (উত্স / মাস্টার) এর মান নির্ধারণ করতে পারে। যোগ

বার্তাটির স্ট্রিমটি পুনরায় খেলুন: আপনি রিপ্লে সাবস্ক্রাইব করার পরে কোনও বিষয় নয় আপনি সমস্ত সম্প্রচারিত বার্তা পাবেন।

সাবজেক্ট এবং রিপ্লে সাবজেক্টে আপনি প্রাথমিক মানটি পর্যবেক্ষণযোগ্যতে সেট করতে পারবেন না। সুতরাং এখানে আচরণগত বিষয় আসে

BehaviorSubject

তারা গরম: কোডটি কার্যকর করা হয় এবং পর্যবেক্ষক না থাকলেও কোডটি সম্প্রচারিত হয়।

ডেটা ভাগ করে: সমস্ত পর্যবেক্ষকের মধ্যে একই ডেটা ভাগ করা হয়।

দ্বি-দিকীয়: পর্যবেক্ষক পর্যবেক্ষণযোগ্য (উত্স / মাস্টার) এর মান নির্ধারণ করতে পারে। যোগ

বার্তাটির স্ট্রিমটি পুনরায় খেলুন: আপনি রিপ্লে সাবস্ক্রাইব করার পরে কোনও বিষয় নয় আপনি সমস্ত সম্প্রচারিত বার্তা পাবেন।

আপনি প্রাথমিক মান নির্ধারণ করতে পারেন: আপনি পর্যবেক্ষণযোগ্যটি ডিফল্ট মান দিয়ে শুরু করতে পারেন।


3
ReplaySubjectএটি উল্লেখযোগ্য যে কোনওটির একটি ইতিহাস রয়েছে এবং এটি (পুরানো) মানগুলির একটি ক্রম সম্প্রচার / প্রবর্তন করতে পারে। কেবল যখন বাফার 1 এ সেট করা থাকে তখন এটি এটির মতো আচরণ করে BehaviorSubject
উইল্ট

28

পর্যবেক্ষণযোগ্য অবজেক্ট একটি পুশ ভিত্তিক সংগ্রহের প্রতিনিধিত্ব করে।

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

সাবজেক্ট ক্লাসটি পর্যবেক্ষক এবং পর্যবেক্ষক উভয়েরই উত্তরাধিকার সূত্রে প্রাপ্ত, এই অর্থে যে এটি পর্যবেক্ষক এবং পর্যবেক্ষণযোগ্য উভয়ই। আপনি সমস্ত পর্যবেক্ষকদের সাবস্ক্রাইব করার জন্য একটি বিষয় ব্যবহার করতে পারেন এবং তারপরে বিষয়টিকে ব্যাকএন্ড ডেটা উত্সের সাবস্ক্রাইব করতে পারেন

var subject = new Rx.Subject();

var subscription = subject.subscribe(
    function (x) { console.log('onNext: ' + x); },
    function (e) { console.log('onError: ' + e.message); },
    function () { console.log('onCompleted'); });

subject.onNext(1);
// => onNext: 1

subject.onNext(2);
// => onNext: 2

subject.onCompleted();
// => onCompleted

subscription.dispose();

Https://github.com/Reactive- এক্সটেনশানস / আরএক্সজেএস / ব্লব / মাস্টার/ ডোক / বিজেটিংস্টার্ড / সাবজেক্টস.এমডি তে আরও


সাবস্ক্রিপশন.ডিসপোজ () এবং সাবস্ক্রিপশন.উনসস্ক্রাইব () এর মধ্যে পার্থক্য কী?
চুপেজ - জেক বাও

4
@ কোপেজ কোনও পার্থক্য নেই দ্বিতীয়টি হ'ল নতুন উপায়
রই নমির

সাবজেক্টটি নিষ্পত্তি করার আগে সাবস্ক্রাইব করা উচিত, অন্যথায়, সাবস্ক্রিপশনটি আবর্জনা হয়ে যায় কারণ এটি নাল মানের সাবস্ক্রাইব করে।
সোফি ঝাং

20

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

এটি একটি জটিল বিষয়, প্রায়শই গ্রন্থাগারগুলি পর্যবেক্ষণযোগ্য হিসাবে ক্ষেত্রগুলি উন্মোচিত করবে (অর্থাত্ অ্যাঙ্গুলার 2 এ অ্যাক্টিভেটরউটে প্যারাম), তবে পর্দার আড়ালে সাবজেক্ট বা আচরণগত বিষয় ব্যবহার করতে পারে। তারা কী ব্যবহার করে তা সাবস্ক্রাইব করার আচরণকে প্রভাবিত করবে।

এখানে দেখুন http://jsbin.com/ziquxapubo/edit?html,js,console

let A = new Rx.Subject();
let B = new Rx.BehaviorSubject(0);

A.next(1);
B.next(1);

A.asObservable().subscribe(n => console.log('A', n));
B.asObservable().subscribe(n => console.log('B', n));

A.next(2);
B.next(2);

11

একটি পর্যবেক্ষণযোগ্য আপনাকে কেবল সাবস্ক্রাইব করার অনুমতি দেয় যেখানে কোনও বিষয় আপনাকে প্রকাশ এবং সাবস্ক্রাইব উভয়কেই অনুমতি দেয়।

সুতরাং একটি বিষয় আপনার পরিষেবাগুলি প্রকাশক এবং গ্রাহক উভয় হিসাবে ব্যবহারের অনুমতি দেয় ।

এখন পর্যন্ত, আমি তেমন ভাল না Observableতাই আমি কেবল একটি উদাহরণ ভাগ করব Subject

আসুন একটি কৌণিক সিএলআই উদাহরণ দিয়ে আরও ভালভাবে বুঝতে পারি । নীচের আদেশগুলি চালান:

npm install -g @angular/cli

ng new angular2-subject

cd angular2-subject

ng serve

এর সামগ্রীটি প্রতিস্থাপন করুন app.component.html:

<div *ngIf="message">
  {{message}}
</div>

<app-home>
</app-home>

ng g c components/homeহোম উপাদান তৈরি করতে কমান্ডটি চালান । এর সামগ্রীটি প্রতিস্থাপন করুন home.component.html:

<input type="text" placeholder="Enter message" #message>
<button type="button" (click)="setMessage(message)" >Send message</button>

#messageএখানে স্থানীয় পরিবর্তনশীল। একটি সম্পত্তি যোগ message: string; করার app.component.tsএর বর্গ।

এই আদেশটি চালান ng g s service/message। এটিতে একটি পরিষেবা উত্পন্ন করবে src\app\service\message.service.tsঅ্যাপ্লিকেশনটিতে এই পরিষেবা সরবরাহ করুন

আমদানি Subjectমধ্যে MessageService। একটি বিষয় যুক্ত করুন। চূড়ান্ত কোডটি এর মতো দেখাবে:

import { Injectable } from '@angular/core';
import { Subject } from 'rxjs/Subject';

@Injectable()
export class MessageService {

  public message = new Subject<string>();

  setMessage(value: string) {
    this.message.next(value); //it is publishing this value to all the subscribers that have already subscribed to this message
  }
}

এখন, এই পরিষেবাটি ইনজেক্ট করুন home.component.tsএবং এটির কনস্ট্রাক্টরের কাছে একটি উদাহরণ দিন। এটির app.component.tsজন্যও করুন। #messageপরিষেবা কার্যের মানটি পাস করার জন্য এই পরিষেবা উদাহরণটি ব্যবহার করুন setMessage:

import { Component } from '@angular/core';
import { MessageService } from '../../service/message.service';

@Component({
  selector: 'app-home',
  templateUrl: './home.component.html',
  styleUrls: ['./home.component.css']
})
export class HomeComponent {

  constructor(public messageService:MessageService) { }

  setMessage(event) {
    console.log(event.value);
    this.messageService.setMessage(event.value);
  }
}

এর ভিতরে app.component.ts, সাবস্ক্রাইব করুন এবং সাবস্ক্রাইব করুন (মেমরি ফাঁস রোধ করতে) Subject:

import { Component, OnDestroy } from '@angular/core';
import { MessageService } from './service/message.service';
import { Subscription } from 'rxjs/Subscription';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html'
})
export class AppComponent {

  message: string;
  subscription: Subscription;

  constructor(public messageService: MessageService) { }

  ngOnInit() {
    this.subscription = this.messageService.message.subscribe(
      (message) => {
        this.message = message;
      }
    );
  }

  ngOnDestroy() {
    this.subscription.unsubscribe();
  }
}

এটাই.

এখন, কোনো মান ভিতরে প্রবেশ #messageএর home.component.htmlথেকে মুদ্রিত হইবে {{message}}ভিতরেapp.component.html


দৈত্য চিত্র কেন? এটি যদি আপনার উত্তরের সাথে সরাসরি সম্পর্কিত না হয় তবে মনে হয় এটি ভোটবাইটের মতো।
ruffin

@ আরফিন এটি আমার পক্ষে গড় ভোটের সংখ্যা সহ একটি গড় উত্তর, আমার প্রোফাইলটি দেখুন। স্পষ্টতই ভোটবাইট নয়: ডি
xameeramir

1
আমি আপনাকে আগে একটি উত্সাহ দিয়েছিলাম, তবে আপনি কেন চিত্রটি রয়েছেন তা নিয়ে প্রশ্ন ছুঁড়েছেন। এটি সরাসরি আপনার উত্তরের সাথে সম্পর্কিত নয়। আপনার কাছে প্রচুর রেপ পেয়েছে কিনা তা কিছু যায় আসে না - যদি চিত্রটি সরাসরি এবং বিশেষভাবে বর্ণনামূলক না হয় তবে আমি আপনাকে এটি সরিয়ে দেওয়ার অনুরোধ করব । /
শ্রাগ

1
@ আরফিন যদি এটি সম্প্রদায়ের সম্মতির বিরুদ্ধে যায় তবে অবশ্যই সেখানে হওয়া উচিত নয়!
xameeramir

4

app.component.ts

behaviourService.setName("behaviour");

behaviour.service.ts

private name = new BehaviorSubject("");
getName = this.name.asObservable();`

constructor() {}

setName(data) {
    this.name.next(data);
}

custom.component.ts

behaviourService.subscribe(response=>{
    console.log(response);    //output: behaviour
});

1

বিহেভিয়ারসুব্জেক্ট বনাম পর্যবেক্ষণযোগ্য : আরএক্সজেএসে পর্যবেক্ষক এবং পর্যবেক্ষণযোগ্য রয়েছে, আরএক্সজেএস ডেটা স্ট্রিমের সাথে ব্যবহার করার জন্য একাধিক ক্লাস সরবরাহ করে এবং এর মধ্যে একটি বিহেভিয়ারসজেক্ট।

পর্যবেক্ষণযোগ্য : পর্যবেক্ষণযোগ্যরা সময়ের সাথে একাধিক মানের অলস সংগ্রহ।

আচরণীয় বিষয়: এমন একটি বিষয় যা প্রাথমিক মান প্রয়োজন এবং এটির বর্তমান মানটি নতুন গ্রাহকদের কাছে নির্ধারণ করে।

 // RxJS v6+
import { BehaviorSubject } from 'rxjs';

const subject = new BehaviorSubject(123);

//two new subscribers will get initial value => output: 123, 123
subject.subscribe(console.log);
subject.subscribe(console.log);

//two subscribers will get new value => output: 456, 456
subject.next(456);

//new subscriber will get latest value (456) => output: 456
subject.subscribe(console.log);

//all three subscribers will get new value => output: 789, 789, 789
subject.next(789);

// output: 123, 123, 456, 456, 456, 789, 789, 789

1

পর্যবেক্ষকগুলিকে এর মধ্যে প্রবাহিত জল সহ একটি পাইপ হিসাবে ভাবুন , কখনও কখনও জল প্রবাহিত হয় এবং কখনও কখনও এটি হয় না। কিছু ক্ষেত্রে, আপনার সম্ভবত এমন পাইপের দরকার হতে পারে যা এতে সর্বদা জল থাকে, আপনি এটি একটি বিশেষ পাইপ তৈরি করে এটি করতে পারেন যা সর্বদা জল যত কমই থাকুক না কেন, এই বিশেষ পাইপটিকে আচরণের বিষয়টিকে কল করতে দিন , যদি আপনি হয়ে থাকেন তবে আপনার সম্প্রদায়ের কোনও জল সরবরাহকারী সরবরাহকারী, আপনার নতুন ইনস্টল করা পাইপটি কেবলমাত্র কাজ করে তা জেনে আপনি রাতে শান্তিতে ঘুমাতে পারেন।

প্রযুক্তিগত ভাষায়: আপনি এমন কোনও ব্যবহারের মুখোমুখি হতে পারেন যেখানে কোনও পর্যবেক্ষকের কাছে সর্বদা এর মূল্য থাকা উচিত, সম্ভবত আপনি সময়ের সাথে সাথে একটি ইনপুট পাঠ্যের মান ক্যাপচার করতে চান, তারপরে আপনি এই জাতীয় আচরণটি নিশ্চিত করার জন্য বিহেভিয়ারসুবজকের একটি উদাহরণ তৈরি করতে পারেন, বলতে দিন:


const firstNameChanges = new BehaviorSubject("<empty>");

// pass value changes.
firstNameChanges.next("Jon");
firstNameChanges.next("Arya");

তারপরে সময়ের সাথে সাথে নমুনা পরিবর্তনের জন্য আপনি "মান" ব্যবহার করতে পারেন।


firstNameChanges.value;

আপনি যখন পর্যবেক্ষণযোগ্যদের পরে একত্রিত করেন তখন এটি কার্যকর হয় যখন আপনার স্ট্রিমের ধরনটি আচরণগত বিষয় হিসাবে একবার দেখে একবার আপনি নিশ্চিত করতে পারেন যে প্রবাহটি কমপক্ষে একবারে আগুনে বা সিগন্যাল হয়ে গেছে

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