ইভেন্টইমিটারের সঠিক ব্যবহার কী?


224

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

আমি এই প্রশ্নটিও পড়েছি যেখানে সমাধানটি সন্তানের কাছে ইভেন্টমিটারটি পাস করার এবং এটিতে সাবস্ক্রাইব করার পরামর্শ দেয়।

তারপরে আমার প্রশ্নটি হ'ল: আমি কি, বা আমার কোনও ইভেন্ট ইভেন্টে ম্যানুয়ালি সাবস্ক্রাইব করা উচিত নয়? আমার এটি কীভাবে ব্যবহার করা উচিত?



2
মার্কের যথারীতি উত্তর, তবে আমি কেন ব্যাখ্যা করেছি তা আসলে তিনি ব্যাখ্যা করেন না। আমি এটি বন্ধ করার বিরুদ্ধে নই, তবে আমি প্রথমে তার মতামত চাই। @ মারকরাজাক্ক ভাবছেন?
এরিক মার্টিনেজ

আমি এটি উন্মুক্ত রাখতে চাই (এবং আমি নিশ্চিত যে আমি এখানে লোকদের দেখাব - আমি এখানে আমার অন্য উত্তরটি এখানে সম্পাদনের জন্য সম্পাদনা করেছি!)। আপনার উত্তরে অতিরিক্ত তথ্য রয়েছে। যদিও আমি দুটি প্রশ্নের শিরোনাম চাই ... অন্যটি হল "ইভেন্টেমিটারটির সঠিক ব্যবহার কী?"
মার্ক রাজকক

@ মারর্করাজকোক আমি এই শিরোনামটি পছন্দ করি তবে এটি বর্তমানের উত্তরের সাথে খাপ খায় না, তাই আমি পরে এটি আপডেট করার বিষয়টি নিশ্চিত করব, কীভাবে এটি ব্যবহার করতে হবে এবং কীভাবে এটি আরও অর্থবোধ করে না তার উদাহরণ যুক্ত করব। আপনার মতামতের জন্য ধন্যবাদ :)
এরিক মার্টিনেজ

@ মার্করজকক প্রস্তাবিত (y) হিসাবে সম্পাদিত, (আপনার কাছে সমস্ত ক্রেডিট প্রস্তাবিত শিরোনামটি অনুলিপি করুন এবং পেস্ট করেছেন)।
এরিক মার্টিনেজ

উত্তর:


342

টিএল; ডিআর :

না, তাদের ম্যানুয়ালি সাবস্ক্রাইব করবেন না, পরিষেবাগুলিতে তাদের ব্যবহার করবেন না। ডকুমেন্টেশনে যেমন উপাদানগুলিতে ইভেন্ট নির্গত হয় তেমনগুলি ব্যবহার করুন। কৌণিক বিমূর্ততা পরাস্ত করবেন না।

উত্তর:

না, আপনার এটিতে ম্যানুয়ালি সাবস্ক্রাইব করা উচিত নয়।

ইভেন্টএমিটার একটি কৌনিক 2 বিমূর্ততা এবং এর একমাত্র উদ্দেশ্য উপাদানগুলিতে ইভেন্টগুলি নির্গত করা। রব ওয়ার্মল্ডের একটি মন্তব্য উদ্ধৃত করে

[...] ইভেন্টইমিটারটি সত্যই একটি কৌণিক বিমূর্ততা, এবং কেবলমাত্র উপাদানগুলিতে কাস্টম ইভেন্টগুলি নির্গত করার জন্য ব্যবহার করা উচিত। অন্যথায়, কেবল আরএক্স ব্যবহার করুন যেন এটি অন্য কোনও লাইব্রেরি।

এটি ইভেন্টইমিটারের ডকুমেন্টেশনে সত্যই পরিষ্কারভাবে বলা হয়েছে।

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

এটি ব্যবহারে কী ভুল?

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

উপরে বর্ণিত সমস্তগুলি এই ওয়ার্ড বেলের মন্তব্যে (নিবন্ধটি পড়ার জন্য প্রস্তাবিত, এবং সেই মন্তব্যের উত্তর ) আরও স্পষ্ট । রেফারেন্সের জন্য উদ্ধৃতি

পর্যবেক্ষণযোগ্য হিসাবে অবিরত ইভেন্টইমিটারে বিশ্বাস করবেন না!

ভবিষ্যতে সেই পর্যবেক্ষণযোগ্য অপারেটররা রয়েছেন বলে গন্য করবেন না!

এগুলি শীঘ্রই হ্রাস করা হবে এবং সম্ভবত মুক্তির আগে মুছে ফেলা হবে।

কেবলমাত্র শিশু এবং পিতামাতার উপাদানগুলির মধ্যে ইভেন্ট বন্ডিংয়ের জন্য ইভেন্টএমিটার ব্যবহার করুন। এটিতে সাবস্ক্রাইব করবেন না। এই পদ্ধতির কোনও কল করবেন না। শুধু কলeve.emit()

তাঁর মন্তব্য রবের মন্তব্যের সাথে সামঞ্জস্যপূর্ণ বহু আগে।

তো, কীভাবে এটি সঠিকভাবে ব্যবহার করবেন?

আপনার উপাদান থেকে ইভেন্টগুলি নির্গত করতে কেবল এটি ব্যবহার করুন। নীচের উদাহরণটি একবার দেখুন।

@Component({
    selector : 'child',
    template : `
        <button (click)="sendNotification()">Notify my parent!</button>
    `
})
class Child {
    @Output() notifyParent: EventEmitter<any> = new EventEmitter();
    sendNotification() {
        this.notifyParent.emit('Some value to send to the parent');
    }
}

@Component({
    selector : 'parent',
    template : `
        <child (notifyParent)="getNotification($event)"></child>
    `
})
class Parent {
    getNotification(evt) {
        // Do something with the notification (evt) sent by the child!
    }
}

কীভাবে এটি ব্যবহার করবেন না?

class MyService {
    @Output() myServiceEvent : EventEmitter<any> = new EventEmitter();
}

ঠিক এখনই থামো ... আপনি ইতিমধ্যে ভুল ...

আশা করা যায় যে এই দুটি সহজ উদাহরণ ইভেন্টেমিটারের সঠিক ব্যবহার সম্পর্কে স্পষ্ট করবে।


1
directives : [Child]কম্পোনেন্ট সংজ্ঞাতে আপনি কী বলতে চাচ্ছেন ? এটি সংকলিত বলে মনে হচ্ছে না, এবং আমি এটি Angular2 ডকুমেন্টেশনে বর্ণিত পাই না।
themathmagician

1
@ এরিক: আপনার উদাহরণে এটি কীভাবে ব্যবহার করবেন না তা খুব স্পষ্টতই, কেন আমাদের একটি পরিষেবাতে '@ আউটপুট' ডেকরেটার প্রয়োজন?
trungk18

1
@ থেমাথম্যাগিশিয়ান কিছুটা গবেষণার পরে, আমি এখানে দেখতে পেলাম যে directivesকীওয়ার্ডটি তখন থেকে অবচয় করা হয়েছে। এখানে বা এখানে নির্দেশিত হিসাবে declarationsকীওয়ার্ডটি ব্যবহার করুন@NgModule
সিজেসিমন

5
টবির আরও সাম্প্রতিক উত্তর সম্পর্কে কোনও মন্তব্য? আমি অনুমান করব যে তার উত্তরটি আজকাল গৃহীত হওয়া উচিত।
আরজান

7
@ এরিক আপনি যখন এই উত্তরটি লিখেছিলেন আপনি লিখেছেন: 'এগুলি শীঘ্রই হ্রাস করা হবে এবং সম্ভবত মুক্তির আগে মুছে ফেলা হবে', ওয়ার্ড বেলের বরাত দিয়ে। তবে এটি 2 বছর আগে বলা হয়েছিল এবং এখন আমাদের কৌণিক 6 রয়েছে। এই বিবৃতি এখনও প্রয়োগ হয়? আমি অফিশিয়াল ডকটিতে দেখতে পেলাম যে ইভেন্টইমিটারের এখনও সাবস্ক্রাইব () পদ্ধতি রয়েছে, তাই আমি মনে করি যে গুগল যদি আরএক্সজেএস বিষয়গুলিতে ইই বেস করা বন্ধ করতে চায় তবে তারা ইতিমধ্যে এটি করে ফেলবে। সুতরাং আপনি কি মনে করেন যে আপনার মূল উত্তরটি এখনও কৌনিক অবস্থার সাথে ভাল ফিট করে?
নাদ জি

100

হ্যাঁ, এগিয়ে যান এবং এটি ব্যবহার করুন।

EventEmitterএকটি হল প্রকাশ্য, নথিভুক্ত টাইপ চূড়ান্ত কৌণিক কোর API এ। এটি ভিত্তিক কিনা Observableতা অপ্রাসঙ্গিক; যদি এর ডকুমেন্টেড emitএবং subscribeপদ্ধতিগুলি আপনার প্রয়োজন অনুসারে চলে আসে তবে এগিয়ে যান এবং এটি ব্যবহার করুন।

ডক্সেও বলা আছে:

Rx.Observable ব্যবহার করে তবে এটি এখানে বর্ণিত হিসাবে কাজ করতে একটি অ্যাডাপ্টার সরবরাহ করে: https://github.com/jhusain/observable-spec

একবার স্পেকের একটি রেফারেন্স বাস্তবায়ন পাওয়া গেলে এটিতে স্যুইচ করুন।

সুতরাং তারা এমন একটি Observableবস্তু চেয়েছিল যা একটি নির্দিষ্ট উপায়ে আচরণ করে, তারা এটি বাস্তবায়িত করে এবং জনসমক্ষে প্রকাশ করে made যদি এটি কেবল অভ্যন্তরীণ কৌণিক বিমূর্ততা ছিল যা ব্যবহার করা উচিত নয়, তবে তারা এটিকে সর্বজনীন করে না।

প্রচুর সময় পাওয়া যায় যখন একটি প্রেরক সরবরাহ করা দরকারী যা একটি নির্দিষ্ট ধরণের ইভেন্টগুলি প্রেরণ করে। যদি এটি আপনার ব্যবহারের ক্ষেত্রে হয় তবে এর জন্য যান। যদি / যখন তাদের সাথে লিঙ্ক করা সেই অনুমানের একটি রেফারেন্স প্রয়োগকরণ পাওয়া যায় তবে এটি অন্য কোনও পলিফিলের মতোই ড্রপ-ইন প্রতিস্থাপন হওয়া উচিত।

কেবল নিশ্চিত হয়ে নিন যে subscribe()ফাংশনে আপনি যে জেনারেটরটি পাস করেছেন সেটি লিঙ্কযুক্ত অনুমান অনুসরণ করে follows প্রত্যাবর্তিত অবজেক্টটির এমন একটি গ্যারান্টি রয়েছে unsubscribeযেটিকে জেনারেটরের কোনও রেফারেন্স মুক্ত করার জন্য ডাকা উচিত (এটি বর্তমানে একটি আরএক্সজেস Subscriptionবস্তু তবে এটি বাস্তবায়নের বিশদ যা নির্ভর করা উচিত নয়)।

export class MyServiceEvent {
    message: string;
    eventId: number;
}

export class MyService {
    public onChange: EventEmitter<MyServiceEvent> = new EventEmitter<MyServiceEvent>();

    public doSomething(message: string) {
        // do something, then...
        this.onChange.emit({message: message, eventId: 42});
    }
}

export class MyConsumer {
    private _serviceSubscription;

    constructor(private service: MyService) {
        this._serviceSubscription = this.service.onChange.subscribe({
            next: (event: MyServiceEvent) => {
                console.log(`Received message #${event.eventId}: ${event.message}`);
            }
        })
    }

    public consume() {
        // do some stuff, then later...

        this.cleanup();
    }

    private cleanup() {
        this._serviceSubscription.unsubscribe();
    }
}

দৃ strongly়-শব্দযুক্ত ডুম এবং অন্ধকারের পূর্বাভাসের সমস্তটি অ্যাঙ্গুলার 2 এর প্রাক-প্রকাশ সংস্করণে একক বিকাশকারীর একক স্ট্যাক ওভারফ্লো মন্তব্য থেকে উদ্ভূত হয়েছে।


2
এটি যুক্তিসঙ্গত শোনায় - অন্য কেউ এই বিষয়ে বিবেচনা করতে চান? সাবস্ক্রাইব সব পরে একটি ইভেন্ট emitter একটি পাবলিক পদ্ধতি?
শাওসন

ঠিক আছে, এটি সর্বজনীন তাই আমরা এটি ব্যবহারে মুক্ত। কিন্তু এই উদাহরণে পর্যবেক্ষণযোগ্য ওভার ইভেন্টইমিটার ব্যবহার করার কোনও ব্যবহারিক কারণ আছে কি?
বোটিস

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

আমি এটি হিসাবে দেখছি "যদি আপনি @ আউটপুটের বাইরে ইভেন্টইমিটার ব্যবহার করেন তবে এপিআই স্থিতিশীল এটিএম হওয়ায় এটিকে অন্য কোনও কিছুতে পরিবর্তন করার দরকার নেই"; আপনার যদি সময় থাকে বা এপিআই ব্রেক হয় তবে আপনাকে এটি পরিবর্তন করতে হবে (তবে মনে রাখবেন কৌণিকের জন্য পাবলিক স্থিতিশীল এপিআই পরিবর্তন করতে (নির্গত এবং সাবস্ক্রাইব করা সাধারণ নয়))। পাবলিক এপি-কেও আটকে দিন, সাবজেক্ট বা অবজারভেবলের পদ্ধতিগুলিতে অ্যাক্সেস করবেন না যা নিরাপদ পাশে থাকার জন্য ইভেন্টইমিটারে সংজ্ঞায়িত নেই
এসিডঘস্ট

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

4

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

উপাদানগুলির মধ্যে সম্পর্কটি যদি পিতা-সন্তানের বা বিপরীত হয় তবে আমরা ইভেন্ট ইনমিটারের সাথে @ ইনপুট & @ আউটপুট ব্যবহার করি ..

@ আউটপুট একটি ইভেন্ট প্রেরণ করে এবং ইভেন্ট ইমিটার ব্যবহার করে আপনাকে নির্গত করতে হবে।

যদি এটি পিতামাতার সন্তানের সম্পর্ক না হয় .. তবে আপনাকে সাবজেক্ট বা একটি সাধারণ পরিষেবার মাধ্যমে ব্যবহার করতে হবে।


0

নেই: ননো এবং না: হ্যাঁ সত্যটি মাঝখানে এবং অ্যাংুলারের পরবর্তী সংস্করণের কারণে ভয় পাওয়ার কোনও কারণ নেই।

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

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

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

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