مرحبا يا هابر! أقدم لكم ترجمة المقال "طرق مختلفة لتمرير المدخلات إلى مكون في الزاوي" بقلم 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 {}
يتم استخدام نفس الاستراتيجية للوحدات البطيئة لأنها تخلق حقنة جديدة.باستخدام التوجيهات
لنفترض أن لدينا مكونات بالكثير من المدخلات. قمنا بتعيين نفس القيم لمعظمها. في المثال ، ستبدو كما يلي:
<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>