2019-06-15
현시점 한글문서와 영문문서의 버전이 다르고 튜토리얼 내용도 다르다.
기본 개념은 크게 달라지지 않았을 것이고 한글 문서가 이해하기 더 빠르니까 버전이 7.2.0이지만 먼저 보면서 친해지고, 영문 문서 튜토리얼을 하자.
angular-cli를 사용한다.
워크스페이스 생성
$ ng new <workspace name>
개발서버 띄우기
$ ng serve --open
컴포넌트 생성
$ ng generate component <component name>
새 프로젝트에는 AppComponent 셸만 존재함. 안에 들어갈 컴포넌트를 생성해야 한다.
서비스 생성
$ ng generate service <service name>
ngOnInit()
라이프사이클 후킹 함수 : 컴포넌트를 생성한 직 후 호출된다. (constructor()보다는 뒤에 호출됨.)
컴포넌트를 초기화 하는 로직을 작성하기 적당하다. 서버에서 받아오는 값으로 컴포넌트를 초기화 해야 할 때에도 사용할 수 있음. (constructor에는 지역변수 초기화 정도만 할 것)
interpolation binding
// app.component.html (템플릿)
<h1>{{title}}</h1> // {{ }} : interpolation binding
two-way binding
템플릿에 [(ngModule)]
을 사용.
ngModel은 앵귤러의 FormsModule에서 제공하는 디렉티브. FormControl 인스턴스를 만들고 Form을 컨트롤하는 엘리먼트에 바인딩함.
AppModule에서 @NgModule 데코레이터의 imports 속성에 FormsModule을 추가해야 하며, @angular/forms 모듈에서 import해줘야함.
<input [(ngModel)]="hero.name" placeholder="name">
event binding
<li ... (click)="onSelect(hero)">
onSelect()
는 이벤트 핸들러 함수. hero를 인자로 전달.
class binding
<li ... [class.selected]="hero === selectedHero">
...
</li>
조건식에 따라 .selected 클래스를 적용/미적용할 수 있다.
property binding
<app-hero-detail [hero]="currentHero"></app-hero-detail>
Pipe
리눅스 명령어에 사용하는 |
와 같은 개념. 서로 독립된 프로세스를 연결해 사용한다. 템플릿에서 바인딩 문법 안에 사용함. 예를들어 {{hero.name | uppercase}}
하면 hero.name의 스트링이 대문자로 변환되어 표시된다. 기본 제공하는것 외에 커스텀으로 만들수도 있다!
Directive
ngModel
, *ngFor
, *ngIf
abstract class 적어도 하나의 추상 메서드가 선언되어야 함. 일반 메서드도 선언 가능. interface와의 차이: interface는 모든 메서드가 추상 메서드 — abstract method: 이름과 타입만 정의된 메서드
접근 제한자 — public : 클래스 내부, 자식 클래스 내부, 인스턴스 — protected: 클래스 내부, 자식 클래스 내부 — private: 클래스 내부
class implements
class Foo implements IFoo {
...
}
Foo 클래스는 IFoo 인터페이스를 구현해야 한다. IFoo에 정의한 메서드를 반드시 포함해야 함.
Duck Typing (structural typing)
코드는 Poiema Web 참조할 것
어떤 함수의 파라미터의 타입으로 특정 인터페이스를 지정했을 때, 인자로 전달되는 인스턴스가 해당 인터페이스를 implement 하고있지 않더라도, 정의한 메서드를 갖추고 있다면 implement한 것으로 판정해 에러를 띄우지 않는다.
meta data
개발자가 만든 Angular 구성요소나 서드파티 파일, 라이브러리를 Angular가 조합할 때는 이 구성요소들에 대한 정보가 필요합니다. 이런 정보를 메타데이터 (metadata) 라고 합니다.
컴포넌트 클래스에 지정해야 하는 메타데이터는 @Component 데코레이터에 지정합니다. 그리고 애플리케이션 동작에 필요한 메타데이터는 보통
@NgModule
데코레이터에 지정합니다.
서비스, 주입
service
는 provider
가 인스턴스를 만들어(혹은 그냥 가져와서) injector
에 등록하면 목적지(컴포넌트 등?)에 주입한다.
@Injectable()
은 사용되지 않는 클래스를 최종 빌드 결과물에서 제거할 대상으로 등록하는 역할도 한다.
@Component 데코레이터의 속성 관련..
@Component({
templateUrl: `./..html`,// 템플릿 파일의 경로
styleUrl: [`./..css`],// 스타일 파일의 경로
// 이렇게 파일로 분리도 가능하지만
template: `
<h1> .. </h1>
`, // html 그대로 인라인 작성 가능
styles: [`
.heroes {
background-color: black;
}
`] // css 그대로 인라인 작성 가능
})
*ngIf
<div *ngIf="selectedHero">
<!-- *ngIf: selectedHero가 truthy일때 DOM에 표시. falsy면 DOM에서 제거함-->
타입스크립트 > 제네릭
제네릭은 선언 시점이 아니라 생성 시점에 타입을 명시하여 하나의 타입만이 아닌 다양한 타입을 사용할 수 있도록 하는 기법이다