طرق مختلفة لتمرير البيانات إلى المكونات الزاوية

مرحبا يا هابر! أقدم لكم ترجمة المقال "طرق مختلفة لتمرير المدخلات إلى مكون في الزاوي" بقلم Netanel Basal.

صورة

في هذه المقالة ، سنقوم بتحليل ثلاث طرق مختلفة لنقل البيانات إلى أحد المكونات. في المثال التالي ، سنستخدم تحديد كمكون رئيسي ، ولكن الطرق المستخدمة فيه ذات صلة بمكونات أخرى.

إنشاء حدد العنصر الذي يتلقى مدخلات يلي - حجم و التنسيب .

باستخدام المدخلات


الطريقة الأولى التي نعرفها جميعًا هي استخدام مصمم الإدخال .

@Component({
  selector: 'app-select',
  template: `
    <p><b>Size</b> {{ size }}</p>
    <p><b>Placement:</b> {{ placement }}</p>    
    `
})
export class SelectComponent {
  @Input() size: 'sm' | 'md' | 'lg' = 'md';
  @Input() placement: 'top' | 'bottom' | 'right' | 'left'  = 'bottom'
}

ويعمل هذا الرمز بشكل رائع ، باستثناء أنه ليس مرنًا جدًا. على سبيل المثال ، نحتاج إلى تعيين متغير الحجم على كبير لأي تحديد في تطبيقنا. لذلك ، يجب أن نسمح للعميل بإعادة كتابة أي مدخلات على مستوى العالم.

استخدام التبعية للحقن


للقيام بذلك ، يمكننا استخدام وظيفة حقن التبعية الزاوية.

import { InjectionToken, Injectable } from '@angular/core';

@Injectable({ providedIn: 'root' })
export class SelectConfig {
  size: 'sm' | 'md' | 'lg' = 'md'
  placement: 'top' | 'bottom' | 'right' | 'left' = 'bottom';
}

export function setSelectConfig(config: Partial<SelectConfig>) {
  return {
    ...new SelectConfig(),
    ...config
  }
}

نحتاج أولاً إلى إنشاء تكوين مزود. يمكن استخدام هذا المزود كما رمزي ، نوع ، وأيضا تعيين القيم الافتراضية لكل المدخلات . نستخدم هذا في المكون المحدد لدينا :

@Component({
  selector: 'app-select',
  template: `
    <p><b>Size</b> {{ size }}</p>
    <p><b>Placement:</b> {{ placement }}</p>    
    `
})
export class SelectComponent {
  @Input() size: SelectConfig['size'];
  @Input() placement: SelectConfig['placement'];

  constructor(private config: SelectConfig) {
    this.size = config.size;
    this.placement = config.placement;
  }
}

الآن يمكننا إعادة كتابة المدخلات المحددة على مستوى تطبيقنا:

@NgModule({
  providers: [
    {
      provide: SelectConfig,
      useValue: setSelectConfig({
        size: 'lg'
      })
    }
  ]
  bootstrap: [AppComponent]
})
export class AppModule { }

لكن هذا ليس كل شيء. يمكننا أيضًا استخدام هذا لتمرير مدخلات مختلفة على مستوى المكونات. على سبيل المثال ، لدينا مكون نستخدمه عدة مرات في التطبيق. في كل حالة ، نحتاج إلى استخدام القيمة الصغيرة :

@Component({
  selector: 'app-todos-page',
  template: `<app-select></app-select>`,
  providers: [
    {
      provide: SelectConfig,
      useValue: setSelectConfig({
        size: 'sm'
      })
    }
  ]
})
export class TodosPageComponent {}

يمكننا إضافة هذا إلى مكون الموفرين وسيتم استخدام هذه القيمة لجميع المكونات المعلنة والطفل في القوالب. ولكن لا يزال بإمكاننا إعادة كتابة هذا المتغير مباشرة على النحو التالي:

@Component({
  selector: 'app-todos-page',
  template: `
   <app-select></app-select>
   <app-select size="lg"></app-select>
`,
  providers: [
    {
      provide: SelectConfig,
      useValue: setSelectConfig({
        size: 'sm'
      })
    }
  ]
})
export class TodosPageComponent {}

يتم استخدام نفس الاستراتيجية للوحدات البطيئة لأنها تخلق حقنة جديدة.

باستخدام التوجيهات


لنفترض أن لدينا مكونات بالكثير من المدخلات. قمنا بتعيين نفس القيم لمعظمها. في المثال ، ستبدو كما يلي:

<!-- It can be in the same template or in different places in the app -->
<app-select size="lg" position="right" inputThree="someValue"></app-select>
<app-select size="lg" position="right" inputThree="someValue"></app-select>
<app-select size="lg" position="right  inputThree="someValue"></app-select>
<app-select size="lg" position="right" inputThree="someValue"></app-select>
<app-select size="lg" position="right" inputThree="someValue"></app-select>

يمكننا تكرار هذه القيم ، ولكن يمكننا إنشاء توجيه يمرر القيم اللازمة لجميع المتغيرات:

@Directive({
  selector: '[selectConfigOne]',
  providers: [{
    provide: SelectConfig,
    useValue: setSelectConfig({
      size: 'lg',
      placement: 'right',
      inputThree: 'someValue'
    })
  }]
})
export class SelectConfigOneDirective {}

ويمكننا استخدام هذا التوجيه حيثما نحتاج:

<h1>Using Inputs</h1>
<app-select size="lg"></app-select>
<app-select placement="top"></app-select>

<h1>Using a Directive</h1>
<app-select selectConfigOne></app-select>

<app-todos-page></app-todos-page>

All Articles