Различные Способы Передачи Данных В Компоненты Angular

Привет, Хабр! Представляю вашему вниманию перевод статьи «Различные способы передачи входных данных компоненту в Angular» Нетанель Базал.



Различные способы передачи данных в компоненты Angular

В этой статье мы рассмотрим три различных способа передачи данных в компонент. В следующем примере мы будем использовать выбирать в качестве основного компонента, но используемые в нем методы актуальны и в других компонентах.

Давайте создадим компонент выбирать который получает следующие входные данные — размер И размещение .



Использование входов

Первый метод, с которым мы все знакомы, — это использование декоратора.

Вход .

  
  
  
  
  
  
  
  
   

@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' }

И этот код прекрасно работает, вот только он не такой гибкий.

Например, нам нужно установить переменную размер значение большой для всех выбирать в нашем приложении.

Таким образом, мы должны разрешить клиенту перезаписывать любые входные данные на глобальном уровне.



Использование внедрения зависимостей

Для этого мы можем использовать функцию внедрения зависимостей Angular.

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>

Теги: #angular #input #injection #directives

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.