কীভাবে উপাদানগুলি উত্তরণ / উত্তরাধিকারী?


160

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

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

নিম্নলিখিত বেস উপাদান সহ app/base-panel.component.ts:

import {Component, Input} from 'angular2/core';

@Component({
    selector: 'base-panel',
    template: '<div class="panel" [style.background-color]="color" (click)="onClick($event)">{{content}}</div>',
    styles: [`
    .panel{
    padding: 50px;
  }
  `]
})
export class BasePanelComponent { 

  @Input() content: string;

  color: string = "red";

  onClick(event){
    console.log("Click color: " + this.color);
  }
}

উদাহরণস্বরূপ শুধু দ্বিতীয় আরেকটি ব্যুৎপন্ন উপাদান তৈরি করতে চান, উদাহরণস্বরূপ রঙ ক্ষেত্রে মৌলিক উপাদান আচরণ, app/my-panel.component.ts:

import {Component} from 'angular2/core';
import {BasePanelComponent} from './base-panel.component'

@Component({
    selector: 'my-panel',
    template: '<div class="panel" [style.background-color]="color" (click)="onClick($event)">{{content}}</div>',
    styles: [`
    .panel{
    padding: 50px;
  }
  `]
})
export class MyPanelComponent extends BasePanelComponent{

  constructor() {
    super();
    this.color = "blue";
  }
}

প্লাঙ্কারে কাজ করার সম্পূর্ণ উদাহরণ

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

যেমন আপনি ডেরাইভেটিভ উপাদানটির বাস্তবায়নে দেখতে পাচ্ছেন, বাস্তবায়নের app/my-panel.component.tsবেশিরভাগ অংশ পুনরাবৃত্তি হয়েছিল, এবং সত্যই উত্তরাধিকার সূত্রে প্রাপ্ত একক অংশটি হ'ল class BasePanelComponent, তবে @Componentকেবল পরিবর্তিত অংশগুলিই মূলত পুরোপুরি পুনরাবৃত্তি করতে হয়েছিল selector: 'my-panel'

উদাহরণস্বরূপ চিহ্নিতকরণ class/ টীকাগুলির সংজ্ঞা উত্তরাধিকার সূত্রে কোনও উপাদান Angular2 এর আক্ষরিক অর্পিত উত্তরাধিকার করার কোনও উপায় আছে কি @Component?

সম্পাদনা 1 - বৈশিষ্ট্য অনুরোধ

বৈশিষ্ট্য অনুরোধ কৌণিক 2 গিটিহাবের প্রকল্পে যুক্ত হয়েছে: কৌণিক 2 উপাদান এনোটেশনগুলি প্রসারিত / বর্ধিত করুন

সম্পাদনা 2 - বন্ধ অনুরোধ

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


এই উত্তরটি চেক করুন stackoverflow.com/questions/36063627/... শুভেচ্ছা সহ
NicolasB

ঠিক আছে নিকোলাসবি। তবে আমার সমস্যাটি হ'ল সাজসজ্জার @ সংস্থার উত্তরাধিকার নিয়ে, যা উত্তরাধিকার মেটাডেটা প্রয়োগ করা হয় না। = /
ফার্নান্দো লিয়াল

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

1
পরিবর্তে বিষয়বস্তু প্রজেকশন ব্যবহার করুন যেমন github.com/angular/components/blob/master/src/matory/card/… উত্তরাধিকার ব্যবহার করবেন না
রবার্ট কিং

উত্তর:


39

বিকল্প সমাধান:

থিয়েরি টেম্প্লেয়ারের এই উত্তরটি সমস্যাটি পাওয়ার জন্য একটি বিকল্প উপায়।

থিয়েরি টেম্প্লেয়ারের সাথে কিছু প্রশ্নের পরে, আমি নিম্নলিখিত কার্যনির্বাহী উদাহরণে এসেছি যা এই প্রশ্নে উল্লিখিত উত্তরাধিকার সীমাবদ্ধতার বিকল্প হিসাবে আমার প্রত্যাশা পূরণ করে:

1 - কাস্টম সাজসজ্জা তৈরি করুন:

export function CustomComponent(annotation: any) {
  return function (target: Function) {
    var parentTarget = Object.getPrototypeOf(target.prototype).constructor;
    var parentAnnotations = Reflect.getMetadata('annotations', parentTarget);

    var parentAnnotation = parentAnnotations[0];
    Object.keys(parentAnnotation).forEach(key => {
      if (isPresent(parentAnnotation[key])) {
        // verify is annotation typeof function
        if(typeof annotation[key] === 'function'){
          annotation[key] = annotation[key].call(this, parentAnnotation[key]);
        }else if(
        // force override in annotation base
        !isPresent(annotation[key])
        ){
          annotation[key] = parentAnnotation[key];
        }
      }
    });

    var metadata = new Component(annotation);

    Reflect.defineMetadata('annotations', [ metadata ], target);
  }
}

2 - @ কম্পোনেন্ট ডেকরেটর সহ বেস উপাদান:

@Component({
  // create seletor base for test override property
  selector: 'master',
  template: `
    <div>Test</div>
  `
})
export class AbstractComponent {

}

3 - @ কাস্টম কম্পোনেন্ট ডেকরেটার সহ উপ উপাদান:

@CustomComponent({
  // override property annotation
  //selector: 'sub',
  selector: (parentSelector) => { return parentSelector + 'sub'}
})
export class SubComponent extends AbstractComponent {
  constructor() {
  }
}

সম্পূর্ণ উদাহরণ সহ প্লঙ্কার।


3
আমি ধরে নিই যে এটি অফলাইনে টেমপ্লেট সংকলকটির সাথে সামঞ্জস্য করবে না।
গন্টার জ্যাচবাউয়ার

@ গন্তেরজ্যাচবাউয়ার, অ্যাঙ্গুলার 2 এর "অফলাইন সংকলক টেম্পলেট" সম্পর্কে আমার কোনও জ্ঞান নেই। তবে আমি মনে করি এটি উপযুক্ত হতে পারে না এবং এটি বিকল্প বিকল্প হবে an অ্যাঙ্গুলার 2 এর মোড "অফলাইন টেম্পলেট সংকলক" কোথায় কার্যকর হবে? আপনি এই সম্পর্কে আরও ভাল কিছু বুঝতে আমাকে প্রদর্শন করতে পারেন? সুতরাং আমি আমার প্রকল্পের জন্য এই সামঞ্জস্যের গুরুত্ব বুঝতে পারি।
ফার্নান্দো লিয়াল

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

1
@ গন্তেরজ্যাচবাউয়ার, এখন আমি ওটিসির সাথে সামঞ্জস্যপূর্ণ কার্যকারিতা বজায় রাখার গুরুত্ব বুঝতে পারি। এটি কৌনিক সাজসজ্জারগুলির একটি প্রাক-সংকলন হবে উপাদানগুলি আরম্ভ করার জন্য ওভারহেড হ্রাস করবে। আমি এই প্রক্রিয়াটির কার্যকারিতা সম্পর্কে জানতে চাই এবং কারণ এই উত্তরের সমাধানটি ওটিসির সাথে সামঞ্জস্যপূর্ণ হবে না? সজ্জাকারদের প্রাক-সংকলনটি কীভাবে হয়? এই জ্ঞান থাকাতে আমরা ওটিসির এই কার্যকরী বিকল্পটি রাখার জন্য কিছু চিন্তা করতে পারি। সুস্পষ্ট করার জন্য ধন্যবাদ!
ফার্নান্দো লিয়াল

24

কৌনিক 2 সংস্করণ 2.3 সবেমাত্র প্রকাশিত হয়েছিল এবং এতে দেশীয় উপাদান উত্তরাধিকার অন্তর্ভুক্ত রয়েছে। দেখে মনে হচ্ছে আপনি টেমপ্লেট এবং শৈলী বাদে আপনি যা কিছু উত্তরাধিকার সূত্রে ওভাররাইড করতে পারেন। কিছু তথ্যসূত্র:


আপনি যখন শিশু উপাদানটিতে একটি নতুন "নির্বাচক" নির্দিষ্ট করতে ভুলে যান তবে এখানে একটি "গোটচা" হয়। আপনি More than one component matched on this elementযদি না করেন তবে আপনি লাইনের পাশাপাশি একটি রানটাইম ত্রুটি পাবেন ।
এলোফিন

@ দ্য সেলফিন হ্যাঁ: প্রতিটি উপাদানটির ট্যাগটিতে একটি সম্পূর্ণ স্পেস থাকতে হবে @Component()। তবে, আপনি চাইলে একই ফাইলটি উল্লেখ করে .html বা .css ভাগ করতে পারেন। সব মিলিয়ে এটি একটি বড় প্লাস।
ড্যানিয়েল গ্রিসকম

আপনার দ্বিতীয় লিঙ্ক scotch.io/tutorials/comp घटक-inheritance- in- angular-2- এ , লেখক দাবি করেছেন যে উপাদানগুলি তাদের পিতামাতার নির্ভরতা ইনজেকশন পরিষেবাদির উত্তরাধিকারী, আমার কোড অন্যথায় পরামর্শ দেয়। আপনি কি নিশ্চিত যে এটি সমর্থিত?
এএলফিন

18

এখন যে টাইপস্ক্রিপ্ট ২.২ ক্লাস এক্সপ্রেশনগুলির মাধ্যমে মিক্সিনকে সমর্থন করে আমাদের কাছে উপাদানগুলিতে মিক্সিন প্রকাশ করার আরও অনেক ভাল উপায় আছে। মনে রাখবেন যে আপনি এখানে অন্যান্য উত্তরগুলিতে আলোচিত হিসাবে কৌনিক ২.৩ ( আলোচনা ) বা একটি কাস্টম সজ্জাকারক থেকে উপাদান উত্তরাধিকারও ব্যবহার করতে পারেন । তবে আমি মনে করি মিক্সিনের এমন কিছু বৈশিষ্ট্য রয়েছে যা তাদের উপাদানগুলির মধ্যে আচরণ পুনরায় ব্যবহারের জন্য পছন্দসই করে তোলে:

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

আমি মেশিনগুলি কীভাবে কাজ করে তা বোঝার জন্য উপরের টাইপস্ক্রিপ্ট ২.২ ঘোষণাটি পড়ার জন্য দৃ strongly়ভাবে পরামর্শ দিচ্ছি। কৌণিক গিটহাব ইস্যুতে লিঙ্কযুক্ত আলোচনাগুলি অতিরিক্ত বিশদ সরবরাহ করে।

আপনার এই ধরণের প্রয়োজন হবে:

export type Constructor<T> = new (...args: any[]) => T;

export class MixinRoot {
}

এবং তারপরে আপনি এই মিক্সিনের মতো একটি মেশিন ঘোষণা করতে পারেন Destroyableযা উপাদানগুলিকে সাবস্ক্রিপশন ট্র্যাক রাখতে সহায়তা করে যেগুলি নিষ্পত্তি করা দরকার ngOnDestroy:

export function Destroyable<T extends Constructor<{}>>(Base: T) {
  return class Mixin extends Base implements OnDestroy {
    private readonly subscriptions: Subscription[] = [];

    protected registerSubscription(sub: Subscription) {
      this.subscriptions.push(sub);
    }

    public ngOnDestroy() {
      this.subscriptions.forEach(x => x.unsubscribe());
      this.subscriptions.length = 0; // release memory
    }
  };
}

Mixin করার Destroyableএকটি মধ্যে Component, আপনি এটির মতো আপনার উপাদান ঘোষণা:

export class DashboardComponent extends Destroyable(MixinRoot) 
    implements OnInit, OnDestroy { ... }

নোটটি MixinRootকেবল তখনই প্রয়োজনীয় যখন আপনি extendমিক্সিন রচনা করতে চান । আপনি সহজেই একাধিক মিশ্রণগুলি প্রসারিত করতে পারেন A extends B(C(D))। এটি আমি মিশ্রণের সুস্পষ্ট লিনিয়ারাইজেশন যা উপরের বিষয়ে বলছিলাম, উদাহরণস্বরূপ আপনি কার্যকরভাবে একটি উত্তরাধিকারের স্তরক্রম রচনা করছেন A -> B -> C -> D

অন্যান্য ক্ষেত্রে যেমন, আপনি যখন বিদ্যমান ক্লাসে মিক্সিন রচনা করতে চান, আপনি মিক্সিনটি এভাবে প্রয়োগ করতে পারেন:

const MyClassWithMixin = MyMixin(MyClass);

তবে, আমি খুঁজে পেলাম যে প্রথম উপায়টি সবচেয়ে ভালভাবে কাজ করে Componentsএবং Directivesযেমন এগুলি পাশাপাশি @Componentবা @Directiveযাইহোক সাজানো দরকার need


এটা সত্যিই দারুন! পরামর্শের জন্য ধন্যবাদ. মিক্সিনরুটটি কি এখানে খালি শ্রেণির স্থানধারক হিসাবে ব্যবহৃত হচ্ছে? আমার বোধগম্যতা সঠিক কিনা তা নিশ্চিত করতে চাই।
অ্যালেক্স লকউড

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

2
আমি ব্যবহার শেষ function Destroyable<T extends Constructor<{}>>(Base = class { } as T)। এইভাবে আমি মিক্সিন ব্যবহার করে তৈরি করতে পারি extends Destroyable()
অ্যালেক্স লকউড

1
এটি দেখতে খুব ভাল লাগছে, তবে মনে হয় যে এওটি বিল্ড (Cli1.3) ড্যাশবোর্ডকোম্পোন্ট থেকে কখনই ডাকা হবে না এনজিওডেস্ট্রয় সরিয়ে দেয়। (একইভাবে এনজিওনিতের জন্য যায়)
dzolnjan

এই সমাধানের জন্য ধন্যবাদ। তবে আয়োনিক বা কৌণিক-ক্লিমে প্রোড বিল্ড করার পরে, মিক্সিনটি কোনওভাবে কাজ করে না, যেন এটি বাড়ানো হয়নি।
হান চে

16

হালনাগাদ

অংশের উত্তরাধিকার 2.3.0-rc.0 থেকে সমর্থিত

মূল

এ পর্যন্ত বেশিরভাগ আমার জন্য সুবিধাজনক পৃথক মধ্যে টেমপ্লেট & শৈলী রাখা *html& *.cssফাইল এবং মাধ্যমে ঐ নির্দিষ্ট templateUrlএবং styleUrlsতাই এটি সহজ পুনর্ব্যবহারযোগ্য রয়েছে।

@Component {
    selector: 'my-panel',
    templateUrl: 'app/components/panel.html', 
    styleUrls: ['app/components/panel.css']
}
export class MyPanelComponent extends BasePanelComponent

2
এটি আমার প্রয়োজন ঠিক তাই। বেসপ্যানেল কম্পোনেন্টের জন্য @ বিভাগের সাজসজ্জারটি কেমন হবে? এটি বিভিন্ন এইচটিএমএল / সিএসএস ফাইলগুলি উল্লেখ করতে পারে? এটি কি মাইপ্যানেল কম্পোনেন্ট দ্বারা উল্লিখিত একই এইচটিএমএল / সিএসএস ফাইলগুলিকে রেফারেন্স করতে পারে?
ebhh2001

1
এটি উত্তরাধিকারী @Input()এবং @Output()সজ্জা পায় না , তাই না?
লিওন অ্যাডলার

10

যতদূর আমি জানি যে অংশের উত্তরাধিকার এখনও কৌণিক 2 তে প্রয়োগ করা হয়নি এবং আমি নিশ্চিত নই যে তাদের পরিকল্পনা আছে কিনা, তবে যেহেতু কৌণিক 2 টাইপ স্ক্রিপ্ট ব্যবহার করছে (আপনি যদি সেই পথে যাওয়ার সিদ্ধান্ত নিয়েছেন) আপনি শ্রেণি উত্তরাধিকার ব্যবহার করতে পারবেন করে class MyClass extends OtherClass { ... }। উপাদান উত্তরাধিকারের জন্য আমি https://github.com/angular/angular/issues এ গিয়ে একটি বৈশিষ্ট্য অনুরোধ জমা দিয়ে কৌণিক 2 প্রকল্পের সাথে যুক্ত হওয়ার পরামর্শ দেব !


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

1
উত্তরাধিকার সূত্রের টাইপস্ক্রিপ্ট সম্পর্কে আমি ইতিমধ্যে আমার প্রাথমিক সমাধানটিতে ব্যবহার করছি ( export class MyPanelComponent extends BasePanelComponent), সমস্যাটি শুধুমাত্র টিকা / সজ্জাবিদদের ক্ষেত্রে উত্তরাধিকারসূত্রে নয়।
ফার্নান্দো লিওল

1
হ্যাঁ, আপনি কী যুক্ত করতে পারেন তা আমি সত্যিই জানি না। আমি হয় নতুন সাজসজ্জার (যেমন কিছু @SubComponent()) আছে যা একটি উপগঠক হিসাবে একটি শ্রেণি চিহ্নিত করে বা @Componentসজ্জাকারীর উপর একটি অতিরিক্ত ক্ষেত্র রয়েছে যা আপনাকে উত্তরাধিকারসূত্রে কোনও পিতামাতার উপাদানকে রেফারেন্স করতে দেয় এমন ধারণাটি আমার পছন্দ হয় ।
ওয়াটজোন

1
বৈশিষ্ট্য অনুরোধ কৌণিক 2 গিটিহাবের প্রকল্পে যুক্ত হয়েছে: প্রসারিত / উত্তরাধিকারী কৌণিক 2 উপাদান টীকা # 7968
ফার্নান্দো লিয়াল

9

আসুন আমরা কৌণিকের উপাদান উত্তরাধিকার সিস্টেমের কিছু মূল সীমাবদ্ধতা এবং বৈশিষ্ট্যগুলি বুঝতে পারি।

উপাদানটি কেবল শ্রেণি যুক্তির উত্তরাধিকার সূত্রে প্রাপ্ত:

  • @ কম্পোনেন্ট ডেকরেটারে সমস্ত মেটা ডেটা উত্তরাধিকারসূত্রে পাওয়া যায় না।
  • উপাদান @ ইনপুট বৈশিষ্ট্য এবং @ আউটপুট বৈশিষ্ট্য উত্তরাধিকারসূত্রে প্রাপ্ত।
  • উপাদান জীবনচক্র উত্তরাধিকারসূত্রে হয় না।

এই বৈশিষ্ট্যগুলি মনে রাখা খুব গুরুত্বপূর্ণ, তাই আসুন আমরা প্রত্যেকে স্বতন্ত্রভাবে পরীক্ষা করি।

উপাদানটি কেবল শ্রেণি যুক্তিকেই উত্তরাধিকারী

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

@ কম্পোনেন্ট ডেকরেটারে সমস্ত মেটা ডেটা উত্তরাধিকারসূত্রে পাওয়া যায় না

কোনও মেটা-ডেটা উত্তরাধিকার সূত্রে প্রাপ্ত নয় এই বিষয়টি প্রথমে পাল্টা স্বজ্ঞাত বলে মনে হতে পারে তবে আপনি যদি এটির বিষয়ে চিন্তা করেন তবে এটি সত্যই সঠিক ধারণা দেয়। আপনি যদি কোনও উপাদানটি (উপাদানবি) থেকে উত্তরাধিকার সূত্রে উত্তীর্ণ হন তবে আপনি কমপোনেন্টএ'র নির্বাচককে চাইবেন না, যা আপনি উত্তরাধিকারসূত্রে প্রাপ্ত বর্গ যা কমপোনেন্টবি'র নির্বাচককে প্রতিস্থাপন করবেন। টেমপ্লেট / টেম্পলেট ইউআরএল পাশাপাশি স্টাইল / স্টাইলআউআরএল জন্য একই কথা বলা যেতে পারে।

উপাদানগুলি ইনপুট এবং @ আউটপুট বৈশিষ্ট্য উত্তরাধিকার সূত্রে প্রাপ্ত

এটি অন্য একটি বৈশিষ্ট্য যা আমি কৌণিক অংশের উত্তরাধিকার সম্পর্কে সত্যই পছন্দ করি। একটি সহজ বাক্যে, যখনই আপনার পছন্দসই @ ইনপুট এবং @ আউটপুট সম্পত্তি থাকে, এই বৈশিষ্ট্যগুলি উত্তরাধিকার সূত্রে প্রাপ্ত হয়।

উপাদান জীবনচক্র উত্তরাধিকারসূত্রে হয় না

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

সুপার / বেস উপাদানগুলির পদ্ধতিগুলি কল করা

কম্পোনেন্টএ ফায়ার থেকে ngOnInit () পদ্ধতিটি পেতে, আমাদের সুপার কীওয়ার্ডটি ব্যবহার করতে হবে এবং তারপরে আমাদের সেই পদ্ধতিটি কল করতে হবে যা এই ক্ষেত্রে ngOnInit। সুপার কীওয়ার্ডটি উত্তরাধিকার সূত্রে প্রাপ্ত উপাদানটির উদাহরণটিকে বোঝায় যা থেকে এই ক্ষেত্রে কম্পোনেন্টএ হবে।


5

আপনি যদি সিডিকে গ্রন্থাগারগুলি এবং উপাদান লাইব্রেরিগুলির মাধ্যমে পড়েন তবে তারা উত্তরাধিকার ব্যবহার করছেন তবে উপাদানগুলির জন্য তাদের পক্ষে এতটা নয়, সামগ্রী প্রজেকশন রাজা আইএমও। এই লিঙ্কটি https://blog.angular-university.io/angular-ng-content/ দেখুন যেখানে এটি "এই নকশার মূল সমস্যা" বলেছে

আমি জানি এটি আপনার প্রশ্নের উত্তর দেয় না তবে আমি সত্যিই মনে করি উত্তরাধিকারসূত্রে / বর্ধিত উপাদানগুলি এড়ানো উচিত । এখানে আমার যুক্তি:

যদি দুটি বা ততোধিক উপাদান দ্বারা প্রসারিত বিমূর্ত শ্রেণিতে ভাগ করা যুক্তি থাকে: একটি পরিষেবা ব্যবহার করুন বা এমনকি একটি নতুন টাইপ স্ক্রিপ্ট ক্লাস তৈরি করুন যা দুটি উপাদানগুলির মধ্যে ভাগ করা যায়।

যদি বিমূর্ত শ্রেণিতে ... ভাগ করা ভেরিয়েবল বা অনক্লিকেটেক ফাংশন রয়েছে, তবে দুটি প্রসারিত উপাদান দর্শনগুলির এইচটিএমএল এর মধ্যে সদৃশ হবে। এটি খারাপ অনুশীলন এবং সেই অংশটি ভাগ করে নেওয়া এইচটিএমএলকে উপাদানগুলিতে ভাগ করা দরকার। এই উপাদানগুলি (অংশ) দুটি উপাদানগুলির মধ্যে ভাগ করা যায়।

আমি উপাদানগুলির জন্য একটি বিমূর্ত ক্লাস করার অন্যান্য কারণগুলি অনুপস্থিত করছি?

একটি উদাহরণ আমি সম্প্রতি দেখেছি যে উপাদানগুলি অটোউন্সক্রাইবকে প্রসারিত করেছিল:

import { Subscription } from 'rxjs';
import { OnDestroy } from '@angular/core';
export abstract class AutoUnsubscribeComponent implements OnDestroy {
  protected infiniteSubscriptions: Array<Subscription>;

  constructor() {
    this.infiniteSubscriptions = [];
  }

  ngOnDestroy() {
    this.infiniteSubscriptions.forEach((subscription) => {
      subscription.unsubscribe();
    });
  }
}

এটি বেস ছিল কারণ একটি বৃহত কোডবেজ জুড়ে infiniteSubscriptions.push()কেবল 10 বার ব্যবহৃত হয়েছিল। এছাড়াও আমদানি ও ব্যাপ্ত AutoUnsubscribeআসলে শুধু জোড়ার তুলনায় অধিক কোড লাগে mySubscription.unsubscribe()মধ্যে ngOnDestroy()উপাদান নিজেই, যা অতিরিক্ত যুক্তিবিজ্ঞান যাহাই হউক না কেন, প্রয়োজনীয় পদ্ধতি।


ঠিক আছে, আমি আপনার সংঘাত বুঝতে পারি এবং আমি সম্মত হই যে সম্মিলনটি প্রায় সমস্ত সমস্যা সমাধান করে যা উত্তরাধিকারের প্রয়োজন বলে মনে হয়। এবং অ্যাপ্লিকেশনটির ছোট ছোট অংশ হিসাবে বিভিন্ন উপায়ে ডক করা যেতে পারে এমন উপাদান হিসাবে বিবেচনা করা সর্বদা আকর্ষণীয়। তবে প্রশ্নের ক্ষেত্রে সমস্যাটি হ'ল যে অংশটি আমি উত্তরাধিকারী হতে চাইছি তার মধ্যে পরিবর্তন / পরিবর্তন করার আমার কাছে নিয়ন্ত্রণ / অ্যাক্সেস নেই (এটি তৃতীয় উপাদান), তবে সমষ্টিটি অনিবার্য হয়ে উঠবে, এবং উত্তরাধিকার আদর্শ সমাধান হবে be
ফার্নান্দো লিয়াল

আপনি কেবলমাত্র একটি নতুন উপাদান তৈরি করতে পারবেন না যা সেই তৃতীয় পক্ষের উপাদানটি encapsulates? আগ্রহের বাইরে আপনার তৃতীয় পক্ষের উপাদানটি কী? যেমন <আমার ক্যালেন্ডার [স্টাফ] = স্টাফ> <তৃতীয় পক্ষ-ক্যালেন্ডার [স্টাফ] = স্টাফ> </ ..> </ ..>
রবার্ট কিং

@ রবার্টকে নিজেকে পুনরাবৃত্তি করা খুব দুর্বল প্যাটার্ন ... এ কারণেই আপনি আপনার কাজটি উপভোগ করার পরিবর্তে ঘৃণা শুরু করবেন।
দারিউস ফিলিপিয়াক

আমার পক্ষে যেমন উপাদানগুলির সেট করার জন্য আপনি একই ইনপুট / আউটপুট প্যারামগুলি পেতে চান সে ক্ষেত্রে উপাদানগুলি প্রসারিত করা ভাল ধারণা, যাতে তারা এক হিসাবে আচরণ করতে পারে। উদাহরণস্বরূপ, আমার বেশ কয়েকটি নিবন্ধকরণ পদক্ষেপ রয়েছে (শংসাপত্রসমূহের স্টেপ, অ্যাড্রেসস্টেপ, নির্বাচনকেন্দ্রবিন্যাস স্টেপ)। তাদের সবার একই ইনপুট বিকল্পগুলি (স্টেপনেম, অ্যাকশনবটন ...) এবং আউটপুট (সম্পূর্ণ, বাতিল) হওয়া উচিত।
সের্গে_২

@ সার্জি _ আপনি এনজি সিলেক্ট এবং কন্টেন্ট প্রজেকশন সহ কোনও উপাদান বিবেচনা করতে পারবেন? কয়েকটি ইনপুট পুনরাবৃত্তি করা মনে হয় না যে আপনি সত্যিই অনেক কার্যকারিতা টিবিএইচ সংরক্ষণ করছেন।
রবার্ট রাজা

2

যদি কেউ আপডেট সমাধানের সন্ধান করে তবে ফার্নান্দোর উত্তরটি বেশ নিখুঁত। ব্যতীত তা ComponentMetadataঅবহেলা করা হয়েছে। Componentপরিবর্তে ব্যবহার করে আমার জন্য কাজ।

সম্পূর্ণ কাস্টম ডেকোরেটর CustomDecorator.tsফাইলটি দেখতে এমন দেখাচ্ছে:

import 'zone.js';
import 'reflect-metadata';
import { Component } from '@angular/core';
import { isPresent } from "@angular/platform-browser/src/facade/lang";

export function CustomComponent(annotation: any) {
  return function (target: Function) {
    var parentTarget = Object.getPrototypeOf(target.prototype).constructor;
    var parentAnnotations = Reflect.getMetadata('annotations', parentTarget);

    var parentAnnotation = parentAnnotations[0];
    Object.keys(parentAnnotation).forEach(key => {
      if (isPresent(parentAnnotation[key])) {
        // verify is annotation typeof function
        if(typeof annotation[key] === 'function'){
          annotation[key] = annotation[key].call(this, parentAnnotation[key]);
        }else if(
          // force override in annotation base
          !isPresent(annotation[key])
        ){
          annotation[key] = parentAnnotation[key];
        }
      }
    });

    var metadata = new Component(annotation);

    Reflect.defineMetadata('annotations', [ metadata ], target);
  }
}

তারপরে এটি আপনার নতুন উপাদান sub-component.component.tsফাইলে আমদানি করুন এবং @CustomComponentএর @Componentমতো পরিবর্তে ব্যবহার করুন :

import { CustomComponent } from './CustomDecorator';
import { AbstractComponent } from 'path/to/file';

...

@CustomComponent({
  selector: 'subcomponent'
})
export class SubComponent extends AbstractComponent {

  constructor() {
    super();
  }

  // Add new logic here!
}

কাস্টম সজ্জাকারকরা কি খুব বেশি নিরুৎসাহিত হন না? অন্যান্য অনেক পোস্ট / থ্রেড থেকে এই সমাধানটিকে সম্পূর্ণ ভুল হিসাবে চিহ্নিত করা হয়েছে কারণ এওটি তাদের সমর্থন করবে না?
TerNovi

2

আপনি @ ইনপুট, @ আউটপুট, @ ভিউচিল্ড ইত্যাদির উত্তরাধিকারী হতে পারেন নমুনাটি দেখুন:

@Component({
    template: ''
})
export class BaseComponent {
    @Input() someInput: any = 'something';

    @Output() someOutput: EventEmitter<void> = new EventEmitter<void>();

}

@Component({
    selector: 'app-derived',
    template: '<div (click)="someOutput.emit()">{{someInput}}</div>',
    providers: [
        { provide: BaseComponent, useExisting: DerivedComponent }
    ]
})
export class DerivedComponent {

}

1

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

হালনাগাদ

@ কম্পোনেন্টটি একটি সাজসজ্জা,

শ্রেণীর ঘোষণাকালে বস্তুগুলিতে নয় সজ্জা প্রয়োগ করা হয়।

মূলত, অলঙ্করণকারীগুলি শ্রেণীর অবজেক্টে কিছু মেটাডেটা যুক্ত করে এবং এটি উত্তরাধিকারের মাধ্যমে অ্যাক্সেস করা যায় না।

আপনি যদি ডেকোরেটর উত্তরাধিকার অর্জন করতে চান তবে আমি একটি কাস্টম সজ্জা লেখার পরামর্শ দেব would নীচের উদাহরণ মত কিছু।

export function CustomComponent(annotation: any) {
    return function (target: Function) {
    var parentTarget = Object.getPrototypeOf(target.prototype).constructor;

    var parentAnnotations = Reflect.getMetadata('annotations', parentTarget);
    var parentParamTypes = Reflect.getMetadata('design:paramtypes', parentTarget);
    var parentPropMetadata = Reflect.getMetadata('propMetadata', parentTarget);
    var parentParameters = Reflect.getMetadata('parameters', parentTarget);

    var parentAnnotation = parentAnnotations[0];

    Object.keys(parentAnnotation).forEach(key => {
    if (isPresent(parentAnnotation[key])) {
        if (!isPresent(annotation[key])) {
        annotation[key] = parentAnnotation[key];
        }
    }
    });
    // Same for the other metadata
    var metadata = new ComponentMetadata(annotation);

    Reflect.defineMetadata('annotations', [ metadata ], target);
    };
};

উল্লেখ করুন: https://medium.com/@ttemplier/angular2-decorators- এবং-class-inheritance- 905921dbd1b7


আপনি উদাহরণস্বরূপ করতে পারেন (প্রশ্নের উদাহরণ ব্যবহার করে) কীভাবে এটি কাজ করবে? আপনি উদাহরণটি তৈরি করতে এবং লিঙ্কটি ভাগ করতে স্ট্যাকব্লিটজ ব্যবহার করতে পারেন ।
ফার্নান্দো লিওল

@ কম্পোনেন্টটি একটি সাজসজ্জাকারী, বস্তুগুলিতে নয় শ্রেণির ঘোষণার সময় সজ্জা প্রয়োগ করা হয়।
মাহেশ ভালিয়ার ভেটিল

তুমি ঠিক. সাজসজ্জাকারীরা কোনও পার্থক্য করেনি। এটি কেবল তখনই প্রয়োজন যখন বেস উপাদানটি অন্য কোথাও উপাদান হিসাবে ব্যবহৃত হয়
MAHESH VALIYA VEETIL

0
just use inheritance,Extend parent class in child class and declare constructor with parent class parameter and this parameter use in super().

1.parent class
@Component({
    selector: 'teams-players-box',
    templateUrl: '/maxweb/app/app/teams-players-box.component.html'
})
export class TeamsPlayersBoxComponent {
    public _userProfile:UserProfile;
    public _user_img:any;
    public _box_class:string="about-team teams-blockbox";
    public fullname:string;
    public _index:any;
    public _isView:string;
    indexnumber:number;
    constructor(
        public _userProfilesSvc: UserProfiles,
        public _router:Router,
    ){}
2.child class
@Component({

    selector: '[teams-players-eligibility]',
    templateUrl: '/maxweb/app/app/teams-players-eligibility.component.html'
})
export class TeamsPlayersEligibilityComponent extends TeamsPlayersBoxComponent{

    constructor (public _userProfilesSvc: UserProfiles,
            public _router:Router) {
            super(_userProfilesSvc,_router);
        }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.