Поиск…


Вступление

Угловые компоненты - это элементы, составленные с помощью шаблона, который отобразит ваше приложение.

Простой компонент

Чтобы создать компонент, добавим @Component decorator в класс, передающий некоторые параметры:

  • providers : ресурсы, которые будут вставляться в конструктор компонента
  • selector : selector запросов, который найдет элемент в HTML и заменит компонентом
  • styles : встроенные стили. ПРИМЕЧАНИЕ. НЕ используйте этот параметр с требованием, он работает над разработкой, но когда вы создаете приложение в процессе производства, все ваши стили теряются
  • styleUrls : массив путей к файлам стиля
  • template : Строка, содержащая ваш HTML-код.
  • templateUrl : путь к файлу HTML

Существуют и другие параметры, которые вы можете настроить, но перечисленные - это то, что вы будете использовать больше всего.

Простой пример:

import { Component } from '@angular/core';
 
@Component({
  selector: 'app-required',
  styleUrls: ['required.component.scss'],
  // template: `This field is required.`,
  templateUrl: 'required.component.html',
})
export class RequiredComponent { }

Шаблоны и стили

Шаблоны - это файлы HTML, которые могут содержать логику.

Вы можете указать шаблон двумя способами:

Передача шаблона в качестве пути к файлу

@Component({
  templateUrl: 'hero.component.html',
})

Передача шаблона в виде встроенного кода

@Component({
  template: `<div>My template here</div>`,
})

Шаблоны могут содержать стили. Стили, объявленные в @Component , отличаются от вашего файла стиля приложения, все, что применяется в компоненте, будет ограничено этой областью. Например, скажем, вы добавляете:

div { background: red; }

Все элементы div внутри компонента будут красными, но если у вас есть другие компоненты, другие div в вашем HTML они вообще не будут изменены.

Сгенерированный код будет выглядеть так:

генерируемый код

Вы можете добавлять стили к компоненту двумя способами:

Передача массива путей к файлам

@Component({
  styleUrls: ['hero.component.css'],
})

Передача массива встроенных кодов

styles: [ `div { background: lime; }` ]

Вы не должны использовать styles с require как это не сработает при создании вашего приложения на производство.

Тестирование компонента

hero.component.html

<form (ngSubmit)="submit($event)" [formGroup]="form" novalidate>
  <input type="text" formControlName="name" />
  <button type="submit">Show hero name</button>
</form>

hero.component.ts

import { FormControl, FormGroup, Validators } from '@angular/forms';

import { Component } from '@angular/core';

@Component({
  selector: 'app-hero',
  templateUrl: 'hero.component.html',
})
export class HeroComponent {
  public form = new FormGroup({
    name: new FormControl('', Validators.required),
  });

  submit(event) {
    console.log(event);
    console.log(this.form.controls.name.value);
  }
}

hero.component.spec.ts

import { ComponentFixture, TestBed, async } from '@angular/core/testing';

import { HeroComponent } from './hero.component';
import { ReactiveFormsModule } from '@angular/forms';

describe('HeroComponent', () => {
  let component: HeroComponent;
  let fixture: ComponentFixture<HeroComponent>;

  beforeEach(async(() => {
    TestBed.configureTestingModule({
      declarations: [HeroComponent],
      imports: [ReactiveFormsModule],
    }).compileComponents();

    fixture = TestBed.createComponent(HeroComponent);
    component = fixture.componentInstance;
    fixture.detectChanges();
  }));

  it('should be created', () => {
    expect(component).toBeTruthy();
  });

  it('should log hero name in the console when user submit form', async(() => {
    const heroName = 'Saitama';
    const element = <HTMLFormElement>fixture.debugElement.nativeElement.querySelector('form');

    spyOn(console, 'log').and.callThrough();

    component.form.controls['name'].setValue(heroName);

    element.querySelector('button').click();

    fixture.whenStable().then(() => {
      fixture.detectChanges();
      expect(console.log).toHaveBeenCalledWith(heroName);
    });
  }));

  it('should validate name field as required', () => {
    component.form.controls['name'].setValue('');
    expect(component.form.invalid).toBeTruthy();
  });
});

Вложенные компоненты

Компоненты будут отображаться в их соответствующем selector , поэтому вы можете использовать это для установки компонентов.

Если у вас есть компонент, который показывает сообщение:

import { Component, Input } from '@angular/core';

@Component({
  selector: 'app-required',
  template: `{{name}} is required.`
})
export class RequiredComponent {
  @Input()
  public name: String = '';
}

Вы можете использовать его внутри другого компонента, используя app-required (селектор этого компонента):

import { Component, Input } from '@angular/core';

@Component({
  selector: 'app-sample',
  template: `
    <input type="text" name="heroName" />
    <app-required name="Hero Name"></app-required>
  `
})
export class RequiredComponent {
  @Input()
  public name: String = '';
}


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow