์ฃ์กํฉ๋๋ค, ์ ๋ ์์ด๋ฅผ ์ ๋ชปํฉ๋๋ค.
@Input
์์ฑ ๊ฐ์ ์์ ๊ตฌ์ฑ ์์์์ ์ ๊ณตํฉ๋๋ค. ๋ณ๊ฒฝ ์ฌํญ์ ๋น๋๊ธฐ์์ผ๋ก ์ ์ฉ๋ฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์์ ๊ตฌ์ฑ ์์์์ Input ์์ฑ์ด ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ(์์ฒด ์์ฑ์ผ๋ก ์์ฑ์ ๊ฐ์ง) ํด๋น ๋ณ๊ฒฝ ๊ฐ์ง๊ธฐ๋ ์ด๋ฅผ ์ธ์ํ์ง ๋ชปํฉ๋๋ค.
@Component({ selector: "child" })
class Child {
@Input("input") inputValue: Observable<T>;
ngOnInit() {
this.inputValue.map((value)=>...);
}
}
@Component({
template: `
<child [input]="valueToChild"></child>
`
})
class Parent {
valueToChild: T;
}
์์ ์ฝ๋๋ ์๋ํ์ง ์์ต๋๋ค. ํ์ฌ Observable<T>
๋ก ์
๋ ฅ์ ๋ฐ์ผ๋ ค๋ฉด ์๋์ ๊ฐ์ด ์์ฑํด์ผ ํฉ๋๋ค.
@Component({ selector: "child" })
class Child {
@Input("input") inputValue: Observable<T>
}
@Component({
template: `
<child [input]="valueToChild"></child>
`
})
class Parent {
valueToChild: Observable<T> = new Observable<T>((observer)=>{
...
observer.next(val);
});
}
์: http://plnkr.co/edit/BWziQygApOezTENdTVp1?p=preview
์ด๊ฒ์ ์ ์๋ํ์ง๋ง ํ์์ ์ธ ๊ฒ์ ์๋๋๋ค. ๋ถ๋ชจ์ ์ ๋ ฅ ๋ฐ์ดํฐ๋ ์๋ ๋จ์ ๋ฐ์ดํฐ์ ๋๋ค.
๋๋ ์ด ์ ์์ด ์ฐ๋ฆฌ๋ฅผ ํ๋ณตํ๊ฒ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ฐ์ฌ ํด์.
์๋ ํ์ธ์ @laco0416 - ๋น์ ์ ์์ด๋ ๊ด์ฐฎ์ต๋๋ค, ๊ฑฑ์ ํ์ง ๋ง์ธ์!
์ ๋ ์ด ์์ด๋์ด๊ฐ ๋งค์ฐ ๋ง์์ ๋ญ๋๋ค. ์ด์ ์ ๋ ผ์ํ ๋ฐ ์์ต๋๋ค. ๋ํ https://github.com/angular/angular/issues/4062 (๋ณด๊ธฐ ์ด๋ฒคํธ ๊ด์ฐฐ) ๋ฐ https://github.com/angular/angular/issues/5467 (๋ถ๋ชจ๋ก๋ถํฐ ๊ด์ฐฐ ๊ฐ๋ฅํ ์์ ์ด๋ฒคํธ)๊ณผ๋ ์ ๋ง์ต๋๋ค.
๋ชจ๋ ์ฌ๋์ด Observable์ ์ฌ์ฉํ๊ณ ์ถ์ดํ๋ ๊ฒ์ ์๋๋ฏ๋ก(์ด ์ฌ๋๋ค์ ๋์น๊ณ ์์ต๋๋ค!) ๋ ์ฌ์ฉ ์ฌ๋ก์ ๋ํ ์ต์
์ ์ ๊ณตํด์ผ ํ๋ฏ๋ก @Input()
๋ฅผ Observable๋ก ์ง์ ๋ง๋ค ๊ฐ๋ฅ์ฑ์ ๊ฑฐ์ ์์ต๋๋ค. @ObserveInput()
๊ฐ์ ๊ฒ์ด ์์ผ๋ฉด ํจ๊ณผ๊ฐ ์์ ๊ฑฐ๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ฐ๋ฆฌ๋ _์ดํ_ ๋ฒ ํ๋ฅผ ์ถ์ํ์ฌ ์ ์๊ฐ์ ๋ ํฅ๋ฏธ๋ก์ด ๊ธฐ๋ฅ ์ค ์ผ๋ถ์ ๋ํด ๋
ผ์ํ ๊ฒ์
๋๋ค.
๊ทธ ๋์์๋ ์ด ์์ด๋์ด์ ๊ธฐ๋ณธ(๊ทธ๋ฆฌ๊ณ _๋งค์ฐ_ ์คํ์ !!! ์ค์ ๋ก ํ์ง ๋ง์ธ์) ๊ตฌํ์ด ์์ต๋๋ค. ์ด๊ฒ์ด ๋น์ ์ด ์๊ฐํ๊ณ ์๋ ๊ฐ๋ ์ ์ ๋๊น? http://plnkr.co/edit/Nvyd9IPBZp9OE2widOcW?p=preview
์์ ๊ตฌ์ฑ ์์์์ ์ ๋ ฅ ์์ฑ์ ๋ณ๊ฒฝํ๋ ๊ฒ์ ๋งค์ฐ ๋์ ์๊ฐ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ ๋ ฅ ์์ฑ์ "์ฝ๊ธฐ ์ ์ฉ"์ด์ด์ผ ํฉ๋๋ค. ๋ฐ์ดํฐ๋ ํญ์ ์์์์ ํ์๋ก ์ด๋ํด์ผ ํ๋ฉฐ ๋ฐ๋ ๋ฐฉํฅ์ผ๋ก๋ ์ ๋ ํ๋ฅด์ง ์์์ผ ํฉ๋๋ค.
@alexpods ์ ๋ ์ฌ๊ธฐ์ ์๋ ์์ด๋์ด๊ฐ ์ ํํ - ์ ๋ ฅ ์์ฑ์ ๋ณ๊ฒฝ์ _๋ฃ๋__ ๊ด์ฐฐ ๊ฐ๋ฅํ๊ณ , ๊ฐ์ ์ ์คํธ๋ฆผ์ผ๋ก ๋ด๋ณด๋ด์ง ์๊ณ , ๋ด๊ฐ ์ฐ๋ คํ๋ ํ ์ ๋์ ์ผ๋ก ๊ด์ฐฎ์ ๊ฒ์ด๋ผ๊ณ ๋ฏฟ์ต๋๋ค.
@robwormald
๋น์ ์ ์์ด๋ ๊ด์ฐฎ์ต๋๋ค, ๊ฑฑ์ ๋ง์ธ์!
๊ฐ์ฌํฉ๋๋ค! ์ ๋ง ์์ฌ์ด ๋ฉ๋๋ค.
๋น์ ์ @ObserveInput
๋ ๋ด๊ฐ ์ํ๋ ๊ฒ์
๋๋ค!
๋ํ @Input
์๋ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ด ์์ต๋๋ค. ์์ฃผ ์ข์ ํด๊ฒฐ์ฑ
์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
@alexpods ์ ๋ ๊ทธ๋ ์ต๋๋ค.
์ ๋ ฅ ์์ฑ์ ๋ณ๊ฒฝ ์ฌํญ์ Observable๋ก ์์ ๋๊ธฐํ๊ณ ๊ฐ์ ์ ์คํธ๋ฆผ์ผ๋ก ๋ด๋ณด๋ด์ง ์์ต๋๋ค.
๋๋ Rob๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์๊ฐํฉ๋๋ค.
@laco0416 ์ , ์คํดํด์ ์ฃ์กํฉ๋๋ค. "์์ ๊ตฌ์ฑ ์์์์ ์ ๋ ฅ ์์ฑ์ด ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ"๋ผ๋ ๋ฌธ๊ตฌ๊ฐ ๋๋ฅผ ํผ๋์ค๋ฝ๊ฒ ํ์ต๋๋ค.
์ฌ๊ธฐ์ ๋๊ธ์ ๋ฌ์์ผ ํ๋์ง ์๋๋ฉด ์ ๋ฌธ์ ๋ฅผ ์ด์ด์ผ ํ๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์๋ชป๋ ์์น์ ์์ฒญ์ ์ถ๊ฐํ๋ ๊ฒฝ์ฐ ์๋ ค์ฃผ์ญ์์ค.
๋๋ ๊ทธ๋ฐ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์์ฑํ๋ ค๊ณ ์๋ํ์ง๋ง(์ง๊ธ๊น์ง๋ ์คํจํ์ง๋ง) @robwormald ์ plunkr ์ ์ฐ์ฐํ ๋ฐ๊ฒฌํ๋๋ฐ _๊ฑฐ์_ ์๋ฒฝํ๊ฒ(๊ทธ๋ฌ๋ ์์ ํ๋ ์๋) ์๋ํฉ๋๋ค.
์ด ์ ๊ทผ ๋ฐฉ์์ด ์ ๋ฅผ ํฅ๋ถ์ํจ ๊ฒ์ ngOnChanges
์๋ช
์ฃผ๊ธฐ ํํฌ์ ํ์ฉํ๊ณ ์๋ค๋ ์ฌ์ค์ด์์ต๋๋ค.
๋ด๊ฐ ๋ณด๊ณ ์ถ์ ๊ฒ์ onChanges$: Observable<{[key: string]: SimpleChange}>
, onInit$: Observable<{}>
๋ฑ๊ณผ ๊ฐ์ด _all_ ์๋ช
์ฃผ๊ธฐ ํํฌ๊ฐ Observable๋ก ๋
ธ์ถ๋๋ ๋ฐฉ๋ฒ์
๋๋ค.
๋ชจ๋ ์๋ช ์ฃผ๊ธฐ ํํฌ๋ฅผ Observable๋ก ์ฌ์ฉํ ์ ์๊ฒ ํ๋ฉด ๋ชจ๋ ๊ฒ์ Rxํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค ;-)
์ด์ ๋ํ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๊น?
AFAIK, ์๋.
@robwormald ์์์ด ์๋์?
๋๋ ์ด๊ฒ์ด ์ค๋๋์๋ค๋ ๊ฒ์ ์๊ณ ์์ง๋ง ์ด๊ฒ์ ์ข์ ๊ฒ์ ๋๋ค! @robwormald ์ด๊ฒ์ ๋ํด
@robwormald ์ @ObserveInput
๋ฐ์ฝ๋ ์ดํฐ๊ฐ ํ๋ ๊ฒ์ฒ๋ผ @Input
์์ฑ ๊ฐ์ Observable๋ก ๋ณ๊ฒฝํ๋ ๊ฒ์ ์ ๊ณตํ๊ณ ์ถ์ต๋๋ค. ํนํ ๊ธฐ์กด(Angular 1) ์์ฉ ํ๋ก๊ทธ๋จ์ ๋ง์ด๊ทธ๋ ์ด์
ํ ๋ ๋ถ๋ชจ ๊ตฌ์ฑ ์์๊ฐ Observable์ ์ ๋ฌํ๋๋ก ํ๋ ๊ฒ์ด ํญ์ ๊ฐ๋ฅํ ๊ฒ์ ์๋๋๋ค. ๊ทธ๋ฌ๋ ๋จ์ผ ๊ตฌ์ฑ ์์ ๋ด์ Observable์ "ํฌํจ"ํ ์ ์๋ค๋ ๊ฒ์ RxJS์ ๊ฐ๋ ฅํจ๊ณผ ์ฐ์ํจ์ ํ์ฉํ๋ ๊ฒ์ ํจ์ฌ ์ด๋ ต๊ฒ ๋ง๋ญ๋๋ค.
๋ถํํ๋ Rob์ ์ด ๋ฒ์ ์ @ObserveInput
๋ฅผ ์ฌ์ฉํ์ง ๋ง๋ผ๊ณ ๋งํ ๊ฒ์ ๋๋ด์ด ์๋๋๋ค. ๋ด๊ฐ ๊ฒช๊ณ ์๋ ๋ฌธ์ ๋ Observable์ด "ํด๋์ค ์์ค"(ํด๋น ์ฉ์ด๊ฐ ์๋ฏธ๊ฐ ์๋ ๊ฒฝ์ฐ)์์ ์์ฑ๋์ด ๊ตฌ์ฑ ์์์ ๋ชจ๋ ์ธ์คํด์ค์์ ๊ณต์ ๋๋ค๋ ๊ฒ์
๋๋ค. ์ด๊ฒ์ ๋ถ๋ช
ํ ์ข์ง ์์ต๋๋ค. ์ธ์คํด์คํ ์๊ฐ์ Observable์ ์์ฑํ๋ ๊ฒ๋ ์ ์๊ฒ ํจ๊ณผ๊ฐ ์์์ต๋๋ค. Angular๊ฐ ์ด ๊ฒฝ์ฐ ๋ณ๊ฒฝ ๊ฐ์ง๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ฐ๊ฒฐํ์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
@ObserveInput
์ ๋ ๋์ ๊ตฌํ์ ๊ด๋ฆฌํ ์ฌ๋์ด ์์ต๋๊น? ์๋๋ฉด ๊ณต์ ์ง์์ ๋ํ ์์์ด ์์ต๋๊น?
@lephyrus ๊ณต์ @ObserveInput
๋ฐ์ฝ๋ ์ดํฐ๋ ๋งค์ฐ ํ๋ฅญํ์ง๋ง @Input
์์ฑ ๊ฐ์ ๋ณ๊ฒฝํ๋ Observable์ ์ป๊ธฐ ์ํด ๊ผญ ํ์ํ ๊ฒ์ ์๋๋๋ค. ๋ฐ์ฝ๋ ์ดํฐ๋ ๋จ์ํ ๋งค์ฐ ์ฐ์ํ "์คํ"์
๋๋ค.
์ด๋ฏธ ์๋ช
์ฃผ๊ธฐ ์ด๋ฒคํธ ngOnChanges
์์ต๋๋ค. ngOnChanges
๋ด๋ถ์์ rxjs Subject
๋ฅผ ์ฌ์ฉํ์ฌ ๋ณ๊ฒฝ ์ฌํญ์ ๊ด์ฐฐํ ์ ์์ต๋๋ค. ์:
<strong i="13">@Input</strong> inputString: string;
private Subject<string> inputString$ = new Subject<string>;
ngOnChanges(changes: { [key: string]: SimpleChange }) {
if (changes.hasOwnProperty('inputString')) {
this.inputString$.next(changes['inputString'].currentValue);
}
}
constructor() {
inputString$.subscribe(x => {
console.log('inputString is now', x);
});
}
๋๋ ๋ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ๊ฒ์ ์ํ๋ฉด ๊ตฌ์ฑ ์์ extends
๊ธฐ๋ณธ ํด๋์ค๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
import { SimpleChange } from '@angular/core';
import { Observable, ConnectableObservable, Observer } from 'rxjs';
export interface TypedSimpleChange<T> {
previousValue: T;
currentValue: T;
}
export class ReactiveComponent {
private changesObserver: Observer<{ [key: string]: SimpleChange }>;
private changes$: ConnectableObservable<{ [key: string]: SimpleChange }>;
constructor() {
this.changes$ = Observable.create((observer: Observer<{ [key: string]: SimpleChange }>) => this.changesObserver = observer).publishReplay(1);
this.changes$.connect();
}
public observeProperty<T>(propertyName: string): Observable<TypedSimpleChange<T>> {
return this.changes$
.filter(changes => changes.hasOwnProperty(propertyName))
.map(changes => changes[propertyName]);
}
public observePropertyCurrentValue<T>(propertyName: string): Observable<T> {
return this.observeProperty<T>(propertyName)
.map(change => change.currentValue);
}
ngOnChanges(changes: { [key: string]: SimpleChange }) {
this.changesObserver.next(changes);
}
}
... ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ ์ ์์ต๋๋ค.
@Component({
...
})
export class YourComponent extends ReactiveComponent {
@Input() inputString: string;
constructor() {
super();
this.observePropertyCurrentValue<string>('inputString')
.subscribe(x => console.log('inputString is now', x));
}
}
๊ณต์ @ObserveInput
๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ ์ ์์ ๋๊น์ง ์ด ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
@wmaurer๋, ๊ฐ์ฌํฉ๋๋ค. ๊ทํ์ ReactiveComponent
๋ ๋งค์ฐ ํ์ํฉ๋๋ค. ํ ์ก์ ๋ฐ ์๋ ์ฝ๋์ ์์ ํ ํ์ดํ์ ์ฌ์ฉํ์ฌ ๋ถํ
ํ ์ ์์ต๋๋ค. ์ ๋ง ์ข์ต๋๋ค! ์ค์ํ ๊ฒ์ ํ
์คํธ์์๋ ์ ์๋ํ๋ฉฐ OnPush
๋ณ๊ฒฝ ๊ฐ์ง ์ ๋ต์ ๊ณ์ ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์
๋๋ค. ์ด์ "๊ณต์ ์คํ"์ ๊ธฐ๋ค๋ฆฌ๊ฒ ๋์ด ๊ธฐ์ฉ๋๋ค. (๋ํ Observable.create()
๋
ผ๋ฆฌ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ์ด์ ๋ฅผ ์๊ฒ ๋๋ฉด ๋ญ๊ฐ๋ฅผ ๋ฐฐ์ฐ๊ฒ ๋ ๊ฒ์ด๋ผ๊ณ ํ์ ํฉ๋๋ค. ์์ง ์ดํด๋ณผ ์๊ฐ์ด ์์ต๋๋ค.) ๋ค์: merci gรคll! :๋์ง:
@lephyrus ์ฒ๋ง ์์, gรคrn gescheh ;-)
๋ด๊ฐ ์ฌ์ฉ Observable.create()
์ก์ ์ป์ Observer
ํ ์ ์๋๋กํ๊ธฐ ์ํด next()
. ๋ด๊ฐ ์ฌ์ฉํ์ ์์๋ Subject
์ธ์ ๋ ๋ชจ๋ Observable
์ Observer
, ๊ทธ๋ฌ๋ ๋๋ ๊ทธ๊ฒ์ด '๋
ธ์ถ'์ ์ผ๋ฐ์ ์ผ๋ก ๋์ ๊ดํ ๋ฏฟ์ต๋๋ค Subject
( Observer
).
@laco0416 ์ https://github.com/angular/angular/issues/13248 ์ ์ฐฌ์ฑํ์ฌ ๋ง๊ฐํฉ๋๊น?
@DzmitryShylovich ์๋์.
@ObserveInput
์ ๋ง ๋ฉ์ง ๊ฒ์
๋๋ค! :+1:
์ข์ ์๋ฅผ ๋ณด์ฌ์ฃผ์ @wmaurer๋ ๊ฐ์ฌํฉ๋๋ค. ํ์ง๋ง ํ ๊ฐ์ง ์ง๋ฌธ์ด ์์ต๋๋ค. ๊ด์ฐฐ ๊ฐ๋ฅ ๊ฐ์ฒด๋ก ๋ฌธ์์ด ๋์ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ ์ ์๊ธฐ๋ฅผ ์ํฉ๋๋ค.
์
@Input() chartConfig: ChartConfig;
constructor(private _reportService: ReportService) {
super();
this.observePropertyCurrentValue<string>('chartConfig')
.subscribe(changedConfig => this.updateChart(changedConfig));
}
export class ChartConfig {
public id: string;
public type: any;
public data: any;
public labels: any;
}
๊ทธ๋ฌ๋ this.updateChart ๋ฐ ngOnChanges๋ ํธ์ถ๋์ง ์์ต๋๋ค. ๋์ ์ ๊ฐ์ฒด๋ฅผ ๊ด์ฐฐํ๊ธฐ ์ํด ๊ฐ๋จํ ๋ฌธ์์ด์์ ์ํ์ ํ์ฅํ๋ ๋ฐฉ๋ฒ์ ๋ฌด์์ ๋๊น?
@ChrisWorks ๊ฐ์ฒด์์๋ ์๋ํด์ผ ํฉ๋๋ค.
this.observePropertyCurrentValue<ChartConfig>('chartConfig')
.subscribe(changedConfig => console.log(changedConfig));
๋๋ ์ด๊ฒ์ ๋งค์ฐ ์์ฃผ ์ํํ๋ฏ๋ก ์ด๊ฒ์ด ์๋ํ์ง ์์ผ๋ฉด ์ด๋๊ฐ์ ๊ตฌ์ฑ ์์์ ๋ํ ์ ๋ ฅ์ ๋ฌธ์ ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์๋ ํ์ธ์ @wmaurer๋ , ๋ต๋ณ ๊ฐ์ฌํฉ๋๋ค. "config" ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ์์ ๋ฒ์ ์ผ๋ก ์ํ์ ํ์ฅํ ์ ์์ต๋๊น? ๋๋ ๋จ์ํ ๋ด ์ผ์ ํ ์ ์์ต๋๋ค. ์ํ Git ๋ฆฌํฌ์งํ ๋ฆฌ? :)
@ChrisWorks ์ ๋ง ์๋ ๊ทธ๋๋ก ์๋ํด์ผ ํฉ๋๋ค. observePropertyCurrentValue
๋ ๋ฌธ์์ด ์
๋ ฅ๊ณผ ๊ฐ์ฒด๋ฅผ ๊ตฌ๋ถํ์ง ์์ต๋๋ค.
๋ค์์ ์
๋ ฅ์ด ๋ฌธ์์ด๋ฟ๋ง ์๋๋ผ ๋ชจ๋ ๋ค๋ฅธ ์ ํ์ธ ๊ณณ์์ ๋ง๋ ์ ๋ง ์ค๋๋ ng2 ๋ฒ ํ 0 ํ๋ก์ ํธ์
๋๋ค.
https://github.com/wmaurer/todomvc-ng2-reactive
์: https://github.com/wmaurer/todomvc-ng2-reactive/blob/master/src/app/todo-item/todo-item.component.ts
+1 ์ด๋ฌํ ๊ธฐ๋ณธ์ ์ธ ์ฌ์ฉ ์ฌ๋ก๋ ์์ง ์ ๋ ฌ๋์ง ์์๋ค๋ ๊ฒ์ด ๋ฏฟ๊ธฐ์ง ์์ต๋๋ค!
๋ง์นจ๋ด ์ต๊ณ ์ ์๋ฃจ์
์ ์ป์๊ณ AOT ์ปดํ์ผ๊ณผ ํจ๊ป ๋ฐ๋ณต ์์ด ์๋ํฉ๋๋ค. ๋น๋ฐ์ @Input()
๋ฅผ ๋ ๋ฒ์งธ ๋ฐ์ฝ๋ ์ดํฐ์ ๊ฒฐํฉํ๋ ๊ฒ์
๋๋ค.
๋ฐ์ฝ๋ ์ดํฐ:
import { ReplaySubject } from 'rxjs/ReplaySubject'
const subjects = new WeakMap()
export function ObservableInput() {
return (target, propertyKey) => {
delete target[propertyKey]
Object.defineProperty(target, propertyKey, {
set(value) {
this[propertyKey].next(value)
},
get() {
let subject = subjects.get(this)
if (! subject) {
subject = new ReplaySubject<any>(1)
subjects.set(this, subject)
}
return subject
},
})
}
}
์ฉ๋ฒ:
class SomeComponent {
@Input() @ObservableInput()
public index: Observable<number>
}
ํธ์ง: ์ด์ ์ด๊ฒ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๋ง๋ค์์ต๋๋ค. ๊ฐ์ ํ ์์ด๋์ด๋ฅผ ๋ฐ๊ฒ ๋์ด ๊ธฐ์ฉ๋๋ค. ๊ธฐ์กด @Input
๋ฅผ Observable
๋ณด์ํ๋ ์๋ก์ด ๋ฐฉ๋ฒ์ ๋ค์์ ์ถ๊ฐํฉ๋๋ค. https://github.com/ohjames/observable-input ์ฐธ์กฐ
๊ทธ๋ฐ ์ผ์ ํด์ผ ํ๋ค๋ฉด ์ฐจ๋ผ๋ฆฌ ngOnChanges: Subject<SimpleChanges>
์ ๋ํ ๋จ์ผ ์ฃผ์ ์๋ ๋ก๊ทธ๋ฅผ ์ฌ์ฉํ๊ฒ ์ต๋๋ค.
์ํ๋ ๊ฒฝ์ฐ ์ฌ์ ํ ํ๋์ ํน์ ์
๋ ฅ์๋ง ํํฐ๋ง ๋ฐ ๋งคํํ ์ ์์ต๋๋ค.
1 ์
๋ ฅ๋น ์ฃผ์ ๋ getter ๋ฐ setter๋ฅผ ์์ฑํ๊ธฐ ์ํด ํด๋์ค ์ํ์ ์ญ์ ํ๊ณ ์
๋ ฅ ์ ํ์ด ์๋ชป๋์์ผ๋ฉฐ input = value
ํ๋ฉด ์ค์ ๋ก ๊ด์ฐฐ ๊ฐ๋ฅํ ๊ฐ์ ๋ด๋ณด๋ด๋ ๊ฒ์ ๋ํด ์ด์ผ๊ธฐํ์ง ์๊ณ ๋ง์ด ๋ณด์
๋๋ค. ๋น์ ์ ์ฃผ์ ๋ฅผ ์๋ฃํฉ๋๋ค.
์ฌ๊ธฐ ์์ ๋ด ์์ด๋์ด์ ๊ตฌํ ์๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค. ๋ฐ์ฝ๋ ์ดํฐ ์ ๊ทผ ๋ฐฉ์์ ์คํ์ ์ด์ง๋ง ์์ ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋งค์ฐ ์์ ํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค(์ฌ๊ธฐ์ ํ์ํ๊ธฐ ์ํด ์ง๊ธ ์ํํ์ผ๋ฉฐ ์ฌ์ฉ๋์ง ์์).
@ghetolay ์ฃผ์ ๊ฐ ์๋ฃ๋์๋์ง ์ฌ๋ถ๋ ์ค์ํ์ง ์์ต๋๋ค. ๋ณด๊ธฐ๊ฐ ๋ซํ๋ฉด ์คํธ๋ฆผ์ ๋ํ ๊ตฌ๋ ์ด ๋ ์ด์ ์๊ณ GC์์
changes$
๋ ๊ตฌ์ฑ ์์์ ๋ํ BehaviorSubject
์ธํฐํ์ด์ค๋ฅผ ๋์ถํฉ๋๋ค. ์ด์์ ์ผ๋ก๋ Observable<...>
๋ก ์
๋ ฅํด์ผ ํฉ๋๋ค.
๋ง์ ์ฃผ์ ์ ๋ฌธ์ ์ ๊ดํด์๋... n
์ฃผ์ ๋ฅผ ์ฌ์ฉํ๋ 1
๋ฅผ ์ฌ์ฉํ๋ ์ฌ์ ํ n
๊ตฌ๋
์ด ์์ต๋๋ค. 1๊ฐ์ ์ฃผ์ ๊ฐ ์๋ ๊ฒฝ์ฐ ๊ฐ ๊ตฌ๋
์ ํ๋์ ๋งต ์ฐ์ฐ์์ ํ๋์ ํํฐ ์ฐ์ฐ์๋ฅผ ์ถ๊ฐํ๊ฒ ๋๋ฉด, ์ด๊ฒ์ ์ฑ๋ฅ ์ค๋ฒํค๋๋ n
์ฃผ์ ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ์์ง ์์ ๊ฒ์ด๋ฉฐ ๋ ๋์ ์ ์์ต๋๋ค.
์
๋ ฅ ๋งค๊ฐ๋ณ์ ์์ฒด์ ํ์ดํ์ ๋ฌด์ํ๋ ๋ฐ์ฝ๋ ์ดํฐ ๊ธฐ๋ฐ ๋ฒ์ ์ any
๊ธฐ๋ฐ์ SimpleChange
์ ํ๋ณด๋ค ์ต์ ๋ฒ๋ธ ์๋น์์๊ฒ ๋ ์ ํ์ด ์์ ํ API๋ฅผ ์ ๊ณตํฉ๋๋ค.
@ohjames
๋ณด๊ธฐ๊ฐ ๋ซํ๋ฉด ์คํธ๋ฆผ์ ๋ํ ๊ตฌ๋ ์ด ๋ ์ด์ ์๊ณ GC์์ ์ญ์ ํ ์ ์์ต๋๋ค.
๋ชจ๋ ๊ตฌ๋ ์ด ๋ณด๊ธฐ์ ์ฐ๊ฒฐ๋๊ณ ๋ณด๊ธฐ์ ๋์ผํ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ฐ๊ฒ ๋๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. Observable์ด ์ด๋ป๊ฒ ์๋น๋๋์ง์ ๋ํด ์ด๋ค ๊ฐ์ ๋ ํ์ง ์์ต๋๋ค.
์ต์ ๋ฒ๋ธ์์ ๊ฐ์ ๋ด๋ณด๋ด๋ ๊ฒ์ด ๊ธฐ๋ณธ์ ์ผ๋ก ์ด๊ฒ์ ์์ ์ ๋๋ค. Angular ์ปดํ์ผ๋ฌ๋ ํ์ฌ ์ ๋ ฅ ์์ฑ ์ ํ์ ํ์ธํ์ง ์์ต๋๋ค. ๋ ๊ณต์์ ์ธ ์์ ์ ์ํํ ๋์ฏค์ด๋ฉด ์ฌ์ฉํ ์ ์์ ๊ฒ์ ๋๋ค. ;)
๋๋ ์ฌ์ฉ์๋ฅผ ์ํด ์ฌ์ฉ์๊ฐ ์ฌ์ ํ ์์ฑ์ ์ก์ธ์คํ๊ณ ์ค์ ํ ์ ์์์ ์๋ฏธํ์ต๋๋ค. ๋ฐ๋ผ์ Observable๋ก ์ ๋ ฅ๋ ๊ฒ์ ์ ์ธํ๊ณ ๋ ์์ฑ์ ์ซ์์ธ ๊ฒ์ฒ๋ผ ์ค์ ํ๊ณ ์์ฑ์ ์ค์ ํ์ง ์๊ณ ๋ฐฉ์ถํ๊ฒ ๋ง๋ญ๋๋ค. ์ด๊ฒ์ ๋์๊ฒ ๋งค์ฐ ํผ๋ ์ค๋ฝ์ต๋๋ค.
๋ง์ ์ฃผ์ ์ ๋ฌธ์ ์ ๊ดํด์๋... n๊ฐ์ ์ฃผ์ ๋ฅผ ์ฌ์ฉํ๋ 1๊ฐ์ ์ฃผ์ ๋ฅผ ์ฌ์ฉํ๋ ์ฌ์ ํ n๊ฐ์ ๊ตฌ๋ ์ด ์์ต๋๋ค. ํ๋์ ์ฃผ์ ๊ฐ ์๋ ๊ฒฝ์ฐ ๊ฐ ๊ตฌ๋ ์ ํ๋์ ๋งต ์ฐ์ฐ์์ ํ๋์ ํํฐ ์ฐ์ฐ์๋ฅผ ์ถ๊ฐํ๊ฒ ๋๋ฉฐ, ์ด๊ฒ์ ์ฑ๋ฅ ์ค๋ฒํค๋๋ n๊ฐ์ ์ฃผ์ ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ์์ง ์์ผ๋ฉฐ ๋ ๋์ ์ ์์ต๋๋ค.
์ฐ๋ฆฌ๋ ๊ณง ์ฃผ์ ๋ชฉ์ ์ ๋ํ ์ด์ ์ ์์ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์ฌ๊ธฐ์ ์ด๋ฐ ์ข ๋ฅ์ ํ ๋ก ์ ๋ค์ด๊ฐ์ง ์์ ๊ฒ์ ๋๋ค.
Subject
๋
ธ์ถํ์ง ์๋๋ก ์
๋ฐ์ดํธํ๊ณ ๋ณ๊ฒฝ ์ฌํญ์ ํ์ดํ์ ์ถ๊ฐํ๊ธฐ ์ํด ๋ฌด์ธ๊ฐ๋ฅผ ๋ง๋ค์์ต๋๋ค.
๋๋ BehaviorSubject
์๋๋ผ ํ๋ฒํ Subject
์๋ํ๋ฉด Observable์ ๊ฐ์น ๋ณด์ ์๋ก ๋ณด์ง ์๊ณ ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ๋ณํํ๊ธฐ ๋๋ฌธ์
๋๋ค.
๋ฐฉ๊ธ ๊ฒฐํจ์ ์ฐพ์์ต๋๋ค. ๋น๋๊ธฐ ํ์ดํ๋ฅผ ์ฌ์ฉํ ๋ ๋น๋๊ธฐ ํ์ดํ๊ฐ ์ฒซ ๋ฒ์งธ ๋ฐฉ์ถ ํ์ ๊ตฌ๋
ํ๊ธฐ ๋๋ฌธ์ ์ฒซ ๋ฒ์งธ ๊ฐ์ด ๋ฐฉ์ถ๋์ง ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ๋ฅผ ์ ์ ํ๊ฒ ์ฒ๋ฆฌํ๊ธฐ ์ํด ๋์ค์ ์ฝ๋๋ฅผ ์
๋ฐ์ดํธํ๊ฒ ์ต๋๋ค.
์ฌ๊ธฐ ๋ค์ ๋งํฌ๊ฐ ์์ต๋๋ค: https://stackblitz.com/edit/angular-observableinput?file=observablechanges%2Fimpl.ts
๋ชจ๋ ๊ตฌ๋ ์ด ๋ณด๊ธฐ์ ์ฐ๊ฒฐ๋๊ณ ๋ณด๊ธฐ์ ๋์ผํ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ฐ๊ฒ ๋๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. Observable์ด ์ด๋ป๊ฒ ์๋น๋๋์ง์ ๋ํด ์ด๋ค ๊ฐ์ ๋ ํ์ง ์์ต๋๋ค.
๋ค ์์ ์ ์๊ฒ ์ต๋๋ค. Observable์ ์๋ฃํ๋ฉด ๋ชจ๋ ๊ตฌ๋ ์ด ๊ฐ์ ์ข ๋ฃ๋์ง๋ง ์ค์ ๋ก ๊ฑฑ์ ํ ์ ๋๋ ์๋๋๋ค. ์ฐ๋ฆฌ ์ฑ์์ ๊ตฌ๋ ์ 99%๋ ๋น๋๊ธฐ ํ์ดํ๋ฅผ ํตํด ๋ฐ์ํ๋ฉฐ, ์ข ์ข CombineLatest/switchMap์ ํตํด Redux/etc์์ ์ ๊ณต๋๋ ์ธ๋ถ ๊ด์ฐฐ ๊ฐ๋ฅ ํญ๋ชฉ์ ์์ค๋ก ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ด์จ๋ ์๋์ผ๋ก ๋ซ์ ํ์๊ฐ ์๋ ์์์ ๊ตฌ๋ ์ ๋๋ค.
์ฐ๋ฆฌ๋ ๊ณง ์ฃผ์ ๋ชฉ์ ์ ๋ํ ์ด์ ์ ์์ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์ฌ๊ธฐ์ ์ด๋ฐ ์ข ๋ฅ์ ํ ๋ก ์ ๋ค์ด๊ฐ์ง ์์ ๊ฒ์ ๋๋ค.
๊ธ์์ ๋น์ ์ ์๋ชป๋ ๋นํ์ ์ ๊ธฐํ์ผ๋ฏ๋ก ๊ทธ๊ฒ์ ๋์ํ ํ์๊ฐ ์์์ต๋๋ค.
~๋ํ ์์์ ํตํด ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ํ์ง ์์ต๋๋ค. AOT ์ปดํ์ผ๋ฌ์ ์ํด ์์ฑ๋ ์ฝ๋๋ ์์ ํด๋์ค์์ ์๋ช
์ฃผ๊ธฐ ๋ฉ์๋๋ฅผ ํธ์ถํ์ง ์์ต๋๋ค. https://github.com/angular/angular/issues/12756#issuecomment -260804139๋ฅผ ์ฐธ์กฐ ngOnDestroy() { super.ngOnDestroy() }
๋ฐ ngOnChanges
์ ๋ํ ๋ ํ๋๋ฅผ ์ถ๊ฐํด์ผ ํฉ๋๋ค. ~ <-- Angular 4.4์์ ํน์ ์ ํ ์ฌํญ์ผ๋ก ์์ ๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋น๋๊ธฐ ํ์ดํ ์ฌ์ฉ์ ๋ํ ์ฐ๋ ค ์ฌํญ์ ๊ฒํ ํ์ผ๋ฉฐ ์ฌ์ ํ ์
๋ ฅ์ ์ก์ธ์คํ ์ ์์ผ๋ฏ๋ก ์ฌ์ฉ๋ฒ์ด ์๋ฏธ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ํ
ํ๋ฆฟ์ ์
๋ ฅ ๊ฐ์ ๋ฐ์ธ๋ฉํ๋ ค๋ ๊ฒฝ์ฐ ์ฌ๊ธฐ์์ ๊ด์ฐฐ ๊ฐ๋ฅ ๋ฐ ๋น๋๊ธฐ๋ฅผ ์ฌ์ฉํ ํ์ ์์ด ์
๋ ฅ์ ์ง์ ๋ฐ์ธ๋ฉํ ์ ์์ต๋๋ค. ์๋ก์ด ์ต์ ๋ฒ๋ธ์ ๊ตฌ์ฑํ๋ ค๋ฉด ์ํ๋ ๊ฒ์ ์ฝ๊ฒ ์ป์ ์ ์์ด์ผ ํฉ๋๋ค(์ด๋๊ฐ์์ startWith
).
๊ทธ๋์ ๋ด ์ด์ ์ง์ ์ด ๊ด์ฐฎ๋ค๊ณ ์๊ฐํฉ๋๋ค.
Observable์ ๊ฐ์น ๋ณด์ ์๋ก ๋ณด์ง ์๊ณ ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ๋ณ๊ฒฝํ๊ธฐ ๋๋ฌธ์ BehaviorSubject๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์ผ๋ฐ Subject๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ์ ๋ ฅ ๊ฐ์ ์ก์ธ์คํด์ผ ํ๋ ๊ฒฝ์ฐ ์์ฑ์ด ์ฌ์ ํ ์กด์ฌํ๋ฉฐ ๋๊ธฐ์ ์ผ๋ก ์ฐธ์กฐํ ์ ์์ต๋๋ค.
์ด ์ฝ๋๋ ๊ณ ๋๋ก ์คํ์ ์ด๋ฉฐ ์ผ์ข
์ poc์ผ ๋ฟ์ด๋ฉฐ ํด๋น stackblitz์์๋ง ์ฌ์ฉํ์ต๋๋ค.
๊ทธ๋์ ๋๋ ๊ทธ๊ฒ์ด ๊ฝค ์์ ํ๋ค๊ณ ๋งํ์ง ๋ง์์ด์ผ ํ๊ณ ์ฃ์กํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ง์ ํ์ ๋๋ก AOT์์ ์๋ํ์ง ์์ ์๋ ์์ต๋๋ค.
๋ฐฉ๊ธ ์๋ํ๊ณ ๋ ๊ฐ์ง ์ ๊ทผ ๋ฐฉ์ ๋ชจ๋ ํ์ฌ AOT(๊ฐ๋ v4.3.6, cli v1.4.1)์์ ์๋ํฉ๋๋ค.
์ฌ๊ธฐ์ ๋ด ์์ ์ ๋ชจ๋ ์
๋ ฅ ๋ณ๊ฒฝ ์ฌํญ์ ํฌํจํ๋ changes
๊ด์ฐฐ ๊ฐ๋ฅ์์ ์ด๋ํ๋ฉด ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ ํ์ํ ๋ชจ๋ ์์
์ ์ํํ ์ ์๋ค๋ ๊ฒ์
๋๋ค. ๋ณ๊ฒฝ, ํน์ ๊ฐ์์ ๋ค๋ฅธ ๊ฐ ๋ฑ์ผ๋ก ๋ณ๊ฒฝ๋์์ ๋...
์ํ๋ Observable์ ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
๋ํ ๊ตฌํ์ ์ํด ๊ด๋ฆฌํ ์ฃผ์ ๋ 1๊ฐ์ด๊ณ ์ฌ์ฉ์๋ฅผ ์ํด ์ฌ์ฉํ ์์ฑ์ ์ ๋ ฅ๋น 1๊ฐ๋ฟ์ ๋๋ค.
๋ด๊ฐ ๋ณ๊ฒฝํ ์ ์๋ ๊ฒ์ ์ฌ์ฉ์๊ฐ pair
๋ฐ map
๋ฅผ ์ฌ์ฉํ์ฌ SimpleChange
์ ๊ฐ์ ์ข
๋ฅ์ ๊ตฌ์กฐ๋ฅผ ์ป์ ์ ์์ผ๋ฏ๋ก SimpleChanges
๊ฐ์ฒด๊ฐ ์๋ ์ ๊ฐ์ ๋ด๋ณด๋ด๋ ๊ฒ์
๋๋ค. SimpleChange
. ๊ทธ๋ฌ๋ ํ์ฌ ์ฐ๋ฆฌ๊ฐ ์ป์ ๊ฒ์ SimpleChanges
์ด๋ฏ๋ก ๋์ค์ ๋น์ทํ ๊ฒ์ ์ฌ๊ตฌ์ฑํ๊ธฐ ์ํด ๋ถํดํ๋ ๊ฒ์ ์ด๋ฆฌ์์ ์ผ์
๋๋ค.
์ถ์ :
๊ธ์์ ๋น์ ์ ์๋ชป๋ ๋นํ์ ์ ๊ธฐํ์ผ๋ฏ๋ก ๊ทธ๊ฒ์ ๋์ํ ํ์๊ฐ ์์์ต๋๋ค.
๋น์ ์๊ฒ ์ ํจํ์ง ์์ต๋๋ค .
์ฑ๋ฅ์ ์ธ๊ธํ ๋ ๊ฐ์ธ์ ์ธ ๊ด์ ์ด ์๋๋ผ ๊ฐ๊ด์ ์ผ๋ก ์ธก์ ํ ์ ์๋ ์ฌ์ค์ ๋๋ค. 3๋ช ์ ์ฃผ์ ๊ฐ 6๋ช ์ ์ถ๊ฐ ์ฐ์ฐ์๋ณด๋ค ๋ ๋ง์ ์ค๋ฒํค๋์ ๊ฐ๋ค๊ณ ๋๋ผ๋ฉฐ, ์๋ง๋ ๋น์ ์ด ์ณ์ ์๋ ์์ง๋ง ์ผ๋ถ ์ธก์ ์ ํ ๋๊น์ง ๊ทธ๊ฒ์ ๋ฏฟ์ ํฉ๋ฆฌ์ ์ธ ๊ทผ๊ฑฐ๊ฐ ์์ต๋๋ค.
๋ง์ ์ ๋ ฅ์ ๋ฐ์ํ๋ ๊ฒฝ์ฐ... switchMap ๋๋ CombineLatest ๋๋ ์ฌ๋ฌ ๊ด์ฐฐ ๊ฐ๋ฅ ํญ๋ชฉ๊ณผ ํจ๊ป ์๋ํ๋๋ก ์ค๊ณ๋ ๋ค๋ฅธ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋น์ ์ ์ด๊ฒ์ ๋ํด ๋งค์ฐ ๋๋ดํ๊ณ ํฌ๊ด์ ์ธ ๋ฐ์ธ์ ํ๊ณ ์์ต๋๋ค. ์ ๋ง๋ก ์ด ๋ํ๋ฅผ ๊ณ์ํ๊ณ ์ถ๋ค๋ฉด ์ด ์ด์ ํธ๋์ปค์์ ์ญ์ ํ๊ฒ ์ต๋๋ค.
๋ค์์ ๋ค์ํ ๋จ์ ๊ณผ ์ฅ์ ์ด ์์ง๋ง ๊ธฐ๋ณธ ํด๋์ค๊ฐ ํ์ํ ๋ฒ์ ์ ๋๋ค.
import { OnChanges, OnDestroy, SimpleChanges } from '@angular/core'
import { BehaviorSubject } from 'rxjs/BehaviorSubject'
import { Observable } from 'rxjs/Observable'
import 'rxjs/add/operator/map'
import 'rxjs/add/operator/distinctUntilChanged'
export class ChangeObserver implements OnChanges, OnDestroy {
protected ngChanges = new BehaviorSubject<object>({})
ngOnChanges(changes: SimpleChanges) {
const props = { ...this.ngChanges.value }
for (const propName in changes) {
props[propName] = changes[propName].currentValue
}
this.ngChanges.next(props)
}
ngOnDestroy() {
this.ngChanges.complete()
}
changes<K extends keyof this>(key: K): Observable<this[K]>
changes<V>(key: string): Observable<V>
changes(key: string) {
return this.ngChanges.map(props => this.ngChanges.value[key]).distinctUntilChanged()
}
}
์ฌ์ฉํ๋ ค๋ฉด:
class MyComponent extends ChangeObserver {
@Input() public field: string
// typescript knows this is Observable<string>
field$ = this.changes('field')
@Input() private privField: number
// typescript can't access private stuff from outside the class so we need to help it out
privField$ = this.changes<number>('privField')
}
๋ด๊ฐ ๋ฌธ์ ๋ฅผ ์๋ชป ์ดํดํ๋์ง ํ์คํ์ง ์์ง๋ง ๋น๋๊ธฐ ํ์ดํ๊ฐ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง ์์ต๋๊น?
[inputVar]="observableValue | async"
..
@najibla ๋น์ ์ด ์๋ชป ์ดํดํ์ต๋๋ค. ์ ๋ ฅ์ ๊ด์ฐฐ ๊ฐ๋ฅํ์ง ์์ผ๋ฏ๋ก ๋น๋๊ธฐ ํ์ดํ๊ฐ ๋์์ด๋์ง ์์ต๋๋ค.
@ohjames ์ ๊ฒฝ์ฐ์๋ ๊ด์ฐฐ ๊ฐ๋ฅ ํญ๋ชฉ์ ๋ํด ๋น๋๊ธฐ ํ์ดํ๋ฅผ ์ฌ์ฉํ์ฌ ์๋ํ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ถ๋ชจ๋ก๋ถํฐ ๊ด์ฐฐ ๊ฐ๋ฅํ ๊ฐ์ ์ ๋ฐ์ดํธํ๋ฉด ๊ฐ์ด ์์ ๊ตฌ์ฑ ์์์ ๋ฐ์๋ฉ๋๋ค.
@najibla ์ด github ๋ฌธ์ ๋ @Input
์์ฑ์ ๊ด์ฐฐ ๊ฐ๋ฅ ํญ๋ชฉ์ผ๋ก ๋ฐ๊พธ๋ ๊ฒ์
๋๋ค. ์ด๊ฒ์ ์ค๋ช
ํ๋ ๊ฒฝ์ฐ์ ๊ฑฐ์ ๊ด๋ จ์ด ์์ต๋๋ค.
์ฆ, ๊ตฌ์ฑ ์์๊ฐ ๊ด์ฐฐ ๊ฐ๋ฅ ํญ๋ชฉ์ ์ฌ์ฉํ์ฌ ๋ณ๊ฒฝ๋๋ ์ ๋ ฅ ์์ฑ์ ์๋ตํ๋์ง ์ฌ๋ถ๋ ๊ตฌ์ฑ ์์ ์์ฒด์์ ๊ฒฉ๋ฆฌ๋์ด์ผ ํ๋ฏ๋ก ์ ๋ ฅ ์์ฑ์ ๋ณด๊ธฐ์์ ๊ด์ฐฐ ๊ฐ๋ฅ ํญ๋ชฉ์ผ๋ก ๋ณํํ ํ์๊ฐ ์์ต๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด Angular์ ์ผ๋ฐ์ ์ธ "๊ด์ฐฐ ๊ฐ๋ฅํ ์ฐ์ " ์ ๊ทผ ๋ฐฉ์๊ณผ ์๋ฐ๋๋ ์์ฑ์ ๊ด์ฐฐ ๊ฐ๋ฅํ ๊ฒ์ผ๋ก ์ฌ์ฉํ๊ธฐ๋ก ๊ฒฐ์ ํ ๊ฒฝ์ฐ ๊ตฌ์ฑ ์์์ ์ธํฐํ์ด์ค๋ฅผ ๋ณ๊ฒฝํด์ผ ํฉ๋๋ค.
@icepeng ์ค์ ๋ก ๋น์ ์ ๊ทธ๊ฒ์ ์ ๋๋ก ์ดํดํ์ง ๋ชปํ์ต๋๋ค. ์ด๊ฒ์ ํ์ค ์ ๋ ฅ์ ๊ด์ฐฐ ๊ฐ๋ฅํ ๊ฒ์ผ๋ก ๋ฐ๊พธ๋ ๊ฒ์ ๊ดํ ๊ฒ์ ๋๋ค. ๋ฐ๋ผ์ ์ ํจํด์ ์ค์ ๋ก ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
<app-child [prop]="prop$ | async"></app-child>
... ๊ทธ๋ฐ ๋ค์ prop
๋ด๋ถ์ AppChildComponent
์ Observable์ด ์๋๋๋ผ๋ Observable๋ก ์ก์ธ์คํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ). ์ด์ ๋ฌผ๋ก ์์์์ ๊ฐ์ด ์ฒ์์ prop$
๊ฐ ์์๋ค๋ฉด ํฉ๋ฆฌ์ ์ด์ง ์์ ๊ฒ์ฒ๋ผ ๋ณด์ผ ์ ์์ต๋๋ค(์ง๊ธ ์
๋ ฅ์ผ๋ก ๊ด์ฐฐ ๊ฐ๋ฅ ํญ๋ชฉ์ ์ด๋ฏธ ์ ๋ฌํ ์ ์์). ์ ๋ฌ ๋ ์
๋ ฅ์ด ์ด๋ฏธ ๊ด์ฐฐ ์๋ ๊ฒฝ์ฐ์๋ ๊ทธ ๊ฐ์ ๋ง์ด ์ ๊ณตํ๋ค (์ index
์์ ngFor
).
์ต์ ๋ฒ๋ธ์ ์
๋ ฅ์ผ๋ก ์ ๋ฌํ๋ ๋ฌธ์ (์ง๊ธ์ ์์ ํ ๊ฐ๋ฅํจ)๋ OnPush
์ ๋๋ก ์๋ํ์ง ์๋๋ค๋ ๊ฒ์
๋๋ค.
๊ฒ์ ์ @fxck ๋น์ ๋ง์์ ngOnChanges
ํธ์ถ๋์ง ์์ต๋๋ค ๋ ๊ด์ฐฐ ๋ฐฉ์ถํ๋ค (์
๋ ฅ์ด ๋์ผํ๊ฒ ์ ์งํ๊ธฐ ๋๋ฌธ์), ๊ทธ๋ฌ๋๋งํผ ๋น์ ์ด ๋น๋๊ธฐ ํ์ดํ๋ฅผ ์ฌ์ฉ์ผ๋ก ํต๊ณผ ๊ด์ธก์ ๊ฐ์
@Input
๋ค์ OnPush
๋ ๋น๋๊ธฐ ํ์ดํ๊ฐ ์์ ๊ตฌ์ฑ ์์์ ๋ณ๊ฒฝ ๊ฐ์ง๊ธฐ๋ฅผ ์๋์ผ๋ก ํธ๋ฆฌ๊ฑฐํ๋ฏ๋ก ์ ๋๋ก ์๋ํฉ๋๋ค.
์, @icepeng์ผ๋ก ํฅํ์ต๋๋ค.
@ohjames @fxck ์ต์ ๋ฒ ๋ธ์ ์ ๋ฌํ๋ ๊ฒ์ด ์ง๊ธ ๊ฐ๋ฅํ์ง ๋ชฐ๋์ต๋๋ค. ์๋ชป๋ ์ ๋ณด๋ฅผ ์ฃ์กํฉ๋๋ค.
Observable์ ์ง์ ์ ๋ฌํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ @ObserveInput
๊ฐ ์ ์ฉํ ์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
๋ณ๊ฒฝํ ์ ์๋ ๊ฐ์ด Observable์ด ์๋๋ฉด ์ด๋ฏธ ๋ฌธ์ ๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๊ฐ์ธ์ ์ธ ์๊ฒฌ์ผ ๋ฟ์
๋๋ค.
@icepeng ์ด๊ฒ์ ๊ณ ๋ คํ์ญ์์ค:
<ng-container *ngFor="value in (values$ | async); let i = index">
<child-component [value]="value" [index]="i"></child-component>
</ng-container>
index
๋ฅผ ํํ๋ฅผ ๊ฑด๋ ๋ฐ์ง ์๊ณ ์ฌ๊ธฐ์์ ๊ด์ฐฐ ๊ฐ๋ฅํ๊ฒ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋ฌด์์
๋๊น?
๋๋ ํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์์ฑ ์ค์ด๊ณ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์๋น์๊ฐ ๊ตฌ์ฑ ์์์ ๊ด์ฐฐ ๊ฐ๋ฅ ํญ๋ชฉ์ ์ ๋ฌํ๋๋ก ๊ฐ์ ํ๊ณ ์ถ์ง ์๋ค๊ณ ์๊ฐํด ๋ณด์ญ์์ค(๋ง์ ์ฌ์ฉ์๊ฐ ์คํธ๋ฆผ์ ์ต์ํ์ง ์๊ณ rxjs๋ฅผ ์ฌ์ฉํ์ง ์์).
์ด๊ฒ์ด ์ ์ฉํ ๋ค๋ฅธ ๋ง์ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค.
@ohjames index
๋ child-component
๊ฐ
BehaviorSubject
์ ๊ทผ ๋ฐฉ์์ด ๋ ๋์ ๊ฒ ๊ฐ์ต๋๋ค. Angular ์ฝ์ด๊ฐ ์ด์ ๊ฐ์ @NgChanges()
๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ ๊ณตํ๋ฉด ์ข์ ๊ฒ์
๋๋ค.
{
@NgChanges() ngChanges$: BehaviorSubject<{ prop: string }>
@Input() prop: string;
ngOnInit() {
this.ngChanges$.subscribe(changes => console.log(changes.prop));
}
}
์ด๊ฒ์ด ๊ตฌํ ๊ฐ๋ฅํ๊ฐ์?
๋ฒํผ ๊ธธ์ด๊ฐ 1์ธ ReplayObservable์ด ์ ํธ๋๋ฉฐ ์์ฑ์ ์ก์ธ์คํ ์ ์๋ ๊ฒฝ์ฐ BehaviourSubject์ ๊ฐ ์๋ฏธ ์ฒด๊ณ๊ฐ ํ์ํ์ง ์์ต๋๋ค.
๊ตฌํ์ด ๊ฐ๋ฅํ์ง ์ฌ๋ถ๋ ๋ค์ํ ๊ตฌํ ๋ฐ ์ต์ ์ ๋ํ ๋ฌธ์ ๋ด์ญ์ ํ์ธํ์ธ์. ์ด๋ ๊ฒ๋ ํ๋ฅญํ์ง ์๊ณ ์ผ๋ถ๋ ์์ ํ ๋ง๊ฐ์ก์ต๋๋ค. ์ ๋๋ก ํ๋ ค๋ฉด ์ฐ๊ฒฐ๋ PR ๋๋ ์ด์ ์ ์ฌํ ๊ฒ์ด ํ์ํฉ๋๋ค.
๋ด 2 ์ผํธ: object.observe๊ฐ ํ๋ก์๋ฅผ ์ ํธํ์ฌ ํ๊ฐ์ ํ๋์๊ธฐ ๋๋ฌธ์ ๋ด ์๋ฃจ์ ์ ํ๋ก์๋ฅผ ํ์ฅํ ๋ค์(์, ์ ์ ์์ต๋๋ค. ์์ฑ์์์ ๋ฐํํ ์ด์ ) ์ฌ๊ธฐ์ ์ํ ํค๋ฅผ ์์ ํ๋ ๊ฒ์ ๋๋ค. $get(keyName) ๋ฉ์๋๋ฅผ ํตํด ๊ฐ์ฒด๋ฅผ Observable๋ก ์ฌ์ฉํฉ๋๋ค. Angular ํด๋์ค 1๋ฟ๋ง ์๋๋ผ ๋ชจ๋ ๊ฐ์ฒด์ ํจ๊ป ์ฌ์ฉํ ์ ์์ต๋๋ค.
import { Observable } from 'rxjs/Observable';
import { Subject } from 'rxjs/Subject';
/**
* Extends this class to be able to observe any key affectation
*/
class ObservableProxy {
private changes: Subject<[PropertyKey, any]> = new Subject<[PropertyKey, any]>();
constructor() {
return new Proxy(this, {
set: (object, key, value) => {
this.changes.next([key, value]);
object[key] = value;
return true;
}
});
}
public $get<K extends keyof this>(key: K): Observable<this[K]> {
const value: this[K] = this[key];
const startWith: Observable<this[K]> = Observable.of(value)
.filter((initialValue) => // remove this filter if you dont mind receiving an undefined value on subscription
initialValue !== undefined;
);
return this.changes
.filter(([changedKey]) => {
return changedKey === key;
})
.map(([changedKey, nextValue]) => nextValue)
.merge(startWith);
}
}
์์:
class User extends ObservableProxy {
public name: string;
}
const user: User = new User();
user.$get("name").subscribe((value)=> {
console.log(value);
})
user.name = "toto"; // prints console.log("toto")
@robwormald , ์ด ๋ฌธ์ ์ ๋ํ ๊ด์ฌ์ด ์์ต๋๊น? ํ์คํ ์ฌ์ฉํ๊ธฐ ์ฝ๊ฒ ๋ง๋๋ ๋ฐ ํฐ ๋์์ด ๋ ๊ฒ์ ๋๋ค.
@bryanrideshark ์ด๊ฒ์ด ์ง์๋ ๊ฐ์ฅ ์ข์ ๊ธฐํ๋ https://github.com/angular/angular/issues/10185๋ฅผ ํตํ๋ ๊ฒ์ ๋๋ค. ์ ์๊ฐ์๋ PR์ด ์ด ๋ฌธ์ ์ ์ฐ๊ฒฐ๋์ง ์์ ๊ฒ์ ๋๋์ต๋๋ค.
์ด๊ฒ์ ์ฐ๋ฆฌ๊ฐ Ivy๋ฅผ ๋ฐฐ์กํ ๋๊น์ง ์ผ์ด๋์ง ์์ ๊ฒ์
๋๋ค
2018๋
2์ 21์ผ ์์์ผ ์ค์ 7์ 56๋ถ์ James Pike [email protected]์์ ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
@bryanrideshark https://github.com/bryanrideshark ์ต๊ณ ์ ๊ธฐํ
์ด๊ฒ์ #10185๋ฅผ ํตํด ์ง์๋ฉ๋๋ค.
https://github.com/angular/angular/issues/10185 ์ ์๊ฐ์๋ ๋๋์ต๋๋ค.
PR์ ์ด ๋ฌธ์ ์ ๊ด๋ จ์ด ์์ต๋๋ค.โ
๋น์ ์ด ์ธ๊ธ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๋ ๊ฒ์ ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/angular/angular/issues/5689#issuecomment-367372931 ,
๋๋ ์ค๋ ๋ ์์๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AAgpkvtGA4w8uHgiz0QsdYwBgqgM2EpAks5tXDyWgaJpZM4Gwr8f
.
๋น์ ์ ์์ด๋ ํ๋ฅญํ๊ณ ๋น์ ์ ๊ฐ๋๋ ๋ ํฝ๋๋ค.
@pldin601 ๊ทํ์ ๋ฐฉ๋ฒ์ AOT ์ปดํ์ผ๋ ์ฝ๋๋ฅผ ์ง์ํ์ง ์์ผ๋ฏ๋ก ๋๋ถ๋ถ์ ์ฌ๋๋ค์ ํ๋ก๋์
์ฝ๋์ ๋ํด ๋ง๋ํ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํฉ๋๋ค. ๋์ AOT์ ์ ์๋ํ๋ observable-input
ํจํค์ง๋ฅผ ํ์ธํ์ญ์์ค.
@pldin601 ์ฝ๋์ ๋ฌธ์ ๋ ngOnDestroy
์๋ช
์ฃผ๊ธฐ ๋ฉ์๋๋ฅผ ๋์ ์ผ๋ก ์ถ๊ฐํ๋ค๋ ๊ฒ์
๋๋ค. AOT ์ปดํ์ผ๋ ์ฝ๋๋ ์ปดํ์ผ๋ฌ๊ฐ ๊ทธ ์กด์ฌ๋ฅผ ์ ์ ์ผ๋ก ์ถ๋ก ํ ์ ์๋ ๊ฒฝ์ฐ์๋ง ngOnDestroy
ํธ์ถํฉ๋๋ค. ๋ฐ๋ผ์ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ ๋ชจ๋ ๊ตฌ์ฑ ์์๊ฐ ngOnDestory
๋ ์ ์ํ๋ ๊ฒฝ์ฐ์๋ง ๋ฉ์๋๊ฐ ์๋ํฉ๋๋ค(ํ์ํ์ง ์์ ๊ฒฝ์ฐ ๋น์ด ์์ ์ ์์). ๋ค๋ฅธ ๋ชจ๋ ๊ฒฝ์ฐ์๋ ๊ตฌ๋
์ด ๋์ถ๋์ด ๊ตฌ์ฑ ์์๊ฐ ๊ฐ๋น์ง ์์ง๋๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค.
์น์
3.2๊ฐ ์๋ฃ๋ ํ์ ์ผ์ด๋ ๊ฒ ๊ฐ์ต๋๊น(์ด ํ์์ฑ์ด ๊ณ ๋ ค๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค)?
https://is-angular-ivy-ready.firebaseapp.com/#/status
Ivy๊ฐ 7.0.0์ ํฌํจ๋ ์์ ์ ๋๊น?
์์ฑ์ ๊ด์ฐฐ ๊ฐ๋ฅํ ๋๋ฐ์ ์์ฑ์ ๋ฐ์ธ๋ฉํ ์ ์๋ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ๊ตฌํํ์ต๋๋ค. ๊ฐ๋ ์
๋ ฅ ์์ฑ๋ฟ๋ง ์๋๋ผ ๋ค๋ฅธ ์์ฑ์๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. @ohjames ์ @ObservableInput()
๋ฐ์ฝ๋ ์ดํฐ์์ ์๊ฐ์ ์ป์์ง๋ง Observable์ ์ ๊ณตํ๊ธฐ ์ํด ๋ค๋ฅธ ์์ฑ์ ์ฌ์ฉํ์ฌ ์์ฑ getter์ setter ๊ฐ์ ์ ํ ๋ถ์ผ์น๋ก ์ธํด ๋ฐ์ํ ์ ์๋ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํฉ๋๋ค.
https://github.com/PSanetra/bind-observable
์์:
class MyClass {
@BindObservable()
public myProp: string = 'initialValue';
public myProp$!: Observable<string>;
}
const myInstance = new MyClass();
myInstance.myProp$.subscribe(console.log);
myInstance.myProp = 'newValue'
์ด ์ฝ๋๋ 'initialValue'
๋ฐ 'newValue'
์ ์ฝ์์ ์ธ์ํฉ๋๋ค.
observable-input
ํจํค์ง๊ฐ ์ง๊ธ๊น์ง ์ถ์๋ ์๊ธฐ์ ๋ํ ์
๋ฐ์ดํธ๋ ์๋ฌด ๊ฒ๋ ๊นจ์ง ์๊ณ ํ์ ๋ถ๋ฅ ์์ด ๊ฐ์ฅ ์ฐ์ํ ๊ฒ์ฒ๋ผ ๋ณด์
๋๋ค. @ohjames ์ด ์์ ์์ ์ผ๋ง๋ ์์ ์ ์ด๊ณ ์ ํ
์คํธ๋์์ต๋๊น?
๊ณต์ ์ง์์ด ๋ ์ฑ์ํด์ง๊ณ ๋ฒ์ ์ ๋ฐ์ ๊ฑธ์ณ ์ง์์ ์ธ ์ง์์ด ๋ณด์ฅ๋๊ณ ๋ ๋ถ๋๋ฌ์ด ๊ฐ๋ฐ ๊ฒฝํ์ด ๋ณด์ฅ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค./๊ฐ๋ฐ์๊ฐ ์ ์ฒด rxjs*๋ก ์ ํํ๊ณ ํธ์ ๋ณ๊ฒฝ ๊ฐ์ง๋ก ์ต์ ํํ๋๋ก ์ฅ๋ คํ ๊ฒ์ ๋๋ค(๋ด ์๊ฐ์ ํต์ฌ์ ์ธ ํ๊ธฐ์ ์ธ ๊ธฐ๋ฅ์ด์ด์ผ ํจ)
* ๊ด์ฐฐํ ์ ์๋ ์ ๋ ฅ๊ณผ์ ํธํ์ฑ์ ์์์ํค์ง ์๊ฑฐ๋ ํ์ด๋ธ๋ฆฌ๋ ์ ๋ ฅ์ ์ํ ์ถ๊ฐ ์์ฉ๊ตฌ๊ฐ ํ์ํ์ง ์์
aot๊ฐ ์๊ฑฐ๋ ์๋ ๊ฐ๋ 4, 5 ๋ฐ 7์์ ๊ด์ฐฐ ๊ฐ๋ฅํ ์ ๋ ฅ์ ์ฌ์ฉํ์ต๋๋ค. ์ ์๋ํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ ์ผ์ ๋ ๋ด๊ฐ ๋ฌด์์ ํ๊ณ ์์๋์ง ๋ง์ฐํ๊ฒ ์๊ณ ์์๋ค๊ณ ํ์ ํ๋ค.
ํ๋ ์์ํฌ์ ์ถ๊ฐํ๊ณ ์ฌ์ฉ์ ๊ถ์ฅํ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. 2์ฃผ๊ฐ ๋ค์ด๋ก๋ npm์ ์ถ๊ฐํ๋ฉด xD๊ฐ ์ ๊ณตํ๋ ์ด์ ์ ๋นํด ์ถฉ๋ถํ์ง ์์ต๋๋ค. ์ฌ๋๋ค์ด ๊ทธ ์ ๊ทผ ๋ฐฉ์์ ๋ฐ๋ฅด๋ ๊ฒ์ด ๊ฐ๋จํ๋ค๋ ๊ฒ์ ์๊ฒ ๋ ๊ฒ์ ๋๋ค.
์ฌ์ฉ์ ์ ์ observer
๋น๋๊ธฐ ์
๋ ฅ์ ๋ํด ๋ค์ API๋ฅผ ์ ์ํฉ๋๋ค.
decalre function AsyncInput(bindName?:string) : <T extends Observer>(target: Object, propertyKey: string, descriptor: TypedPropertyDescriptor<T>) => any
์ฌ์ฉ์๋ ๊ทธ๋๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
@AsyncInput()
asynchronusProperty1 = new Subject();
@AsyncInput()
asynchronusProperty2 = new ReplySubject(1);
@AsyncInput()
asynchronusProperty3 = new UserObserver(); // where UserObserver implement `Observer` interface
Angular ๋ด๋ถ๋ ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋๋ง๋ค observer.next(newValue)
ํธ์ถํ ์ ์์ต๋๋ค.
@HostBinding
์ง์๋ ์์ง ๋ง์ธ์!
์ด๊ฒ์ ์์ฑ์ @Input ์ฃผ์ ๊ณผ ๊ฒฐํฉํ์ฌ ํจ์ฌ ๋ ๋ฉ์ง๊ฒ ๋ง๋ค์ด์ผ ํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋งค์ฐ ์ฐ์ํ ๋ฐฉ์์ผ๋ก "strictPropertyInitialization"์ ์์ ํ ์ ์์ต๋๋ค.
class MyComponent {
inputData$: Observable<Data>;
constant: string;
constructor(
@Input() inputData$: Observable<Data>,
@Input() constantString: string
) {
this.inputData$ = inputData$;
this.constant = constantString;
}
}
@benneq ๋ ๋ค์๊ณผ ๊ฐ์ด ์์ ์ ์๋ค๋ ์ ์ ์ฃผ๋ชฉํ ๊ฐ์น๊ฐ ์์ต๋๋ค.
class MyComponent {
constructor(
@Input() private inputData$: Observable<Data>,
@Input() private constantString: string,
) {}
}
@maxime1992 ๋ค, ๊ด์ฐฐ ๊ฐ๋ฅ ํญ๋ชฉ์ด ํ ๊ตฌ์ฑ ์์์์ ๋ค๋ฅธ ๊ตฌ์ฑ ์์๋ก ์ ๋ฌ๋๋ ๊ฒฝ์ฐ๋ฅผ ๊ตฌ๋ถํ๋ ค๋ฉด ์ ๋ ฅ ํญ๋ชฉ์ ๋ํด ๋ณ๋์ ๋ฐ์ฝ๋ ์ดํฐ๊ฐ ํ์ํฉ๋๋ค.
@benneq @maxime1992 ๋งค๊ฐ๋ณ์ ์ด๋ฆ์ ๋ฐ์ฝ๋ ์ดํฐ ๋ฉํ๋ฐ์ดํฐ์ ์ผ๋ถ๊ฐ ์๋๋๋ค. ์ด๋ป๊ฒ ๋งคํํ๋์?
@trotyl ๊ทธ๋ฌ๋ฉด @Input('paramName') private myParam: Observable<Data>
๋ฅผ ์ฌ์ฉํ ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค.
@trotyl @benneq ๋ค, ์ ์๋ชป์ ๋๋ค. ์ ๊ฒฝ์ฐ์ง ๋ง์ธ์ :zipper_mouth_face:
๋๊ตฐ๊ฐ ์ด๋ฏธ ์ด ์๋ฃจ์ ์ ๊ฒ์ํ๋์ง๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง ์ด๊ฒ์ ์๋นํ ์ข์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋๋ค.
@ElianCordoba ์ด๊ฒ์ HTML <input>
์ ๊ดํ ๊ฒ์ด ์๋๋๋ค. ๊ฐ @Input()
๊ทธ๊ฒ์ ๋ค๋ฅด์ง๋ง ๋น์ทํ๊ฒ ๊ณ ํต์ค๋ฌ์ด ๋ฌธ์ @ElianCordoba์ ๋๋ค. https://github.com/angular/angular/issues/13248
๋๋ ์ด๊ฒ์ด ์์ฌ ์๊ตฌ ์ฌํญ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ฒซ์งธ, ์ ๋ ฅ ๋ฐ์ฝ๋ ์ดํฐ๋ Observable ์ ํ ๊ฐ์ ๋ฐ์๋ค์ผ ์ ์์ต๋๋ค. ๋์งธ, ๊ตฌ์ฑ ์์๊ฐ ์ ๋ ฅ์ผ๋ก ๊ด์ฐฐ ๊ฐ๋ฅ์ ์๊ตฌํ๋ ๊ฒฝ์ฐ ๊ด์ฐฐ ๊ฐ๋ฅํ์ง ์์ ๊ฐ์ ์์ ํ ๋ ์กฐ์ฉํ Observable ์ ํ ๊ฐ์ผ๋ก ๋ณํํ๋ ๋์ ๋ช ์์ ์ผ๋ก ์ค๋ฅ๋ฅผ ๋ฐ์์์ผ์ผ ํฉ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์ ์์์ ์ ํ ๋ณํ๊ณผ ๋งค์ฐ ์ ์ฌํ์ฌ ๋ฒ๊ทธ๋ฅผ ์ ๋ฐํ๊ณ ์ฐพ๊ธฐ ์ด๋ ค์ธ ์๋ ์์ต๋๋ค.
์๋ชป๋ ์ ๋ ฅ์ ์นจ๋ฌต์ํค๋ ๊ฒ์ด ์๋๋๋ค. ์ปดํฌ๋ํธ ๊ฐ์ ๊ณตํต ์ธํฐํ์ด์ค๋ฅผ ๋ ธ์ถํ๋ ๊ฒ์ ๋๋ค(๊ด์ฐฐํ ์ ์๋ ์ ๋ ฅ์). ์ด๋ฅผ ํตํด ์ธ๋ถ ์ธ๊ณ์์ ์ธํฐํ์ด์ค๋ฅผ ์์์ํค์ง ์๊ณ rx ๊ธฐ๋ฅ์ ์์ ๋กญ๊ฒ ๋์ ํ ์ ์์ต๋๋ค. ๋ ๋ค๋ฅธ ์ด์ ์ ์ฃผ๋ก ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ๊ณผ ๋ด๋ถ ์ํ๋ฅผ ๋ค์ด ์ฌ๋ฆฌ๋ ๊ฒ์ ๋๋ค. ๋ชจ๋ ๊ฒ์ด ์ ๋ ฅ์ ๋ณํ์ด๋ฏ๋ก ํด๋น ์ง์ ์์ ํธ์ ๋ณ๊ฒฝ ๊ฐ์ง๋ฅผ ๋ ์ด์ ์๊ฐํ ํ์๊ฐ ์์ต๋๋ค.
๋ฐ๋๋ก ์ต์ ๋ฒ๋ธ์ ์๊ตฌํ๋ ์ธํฐํ์ด์ค๋ฅผ ๋ ธ์ถํ๋ ๊ฒ์ ํฌ๋ฐํ๊ฒ ๋ค๋ฆด ๋ฟ ์๋๋ผ ๊ตฌ์ฑ ์์๊ฐ ๊ทธ๋ ๊ฒ ์ด์ํ๊ฒ ๋ค๋ฆฐ๋ค๋ ์ด์ ๋ง์ผ๋ก ์ฌ๋๋ค์ด of(value)๋ฅผ ์ ๊ณตํ๋๋ก ๊ฐ์ํฉ๋๋ค.
๋ํ ์๋ ๋ณํ์ด ์๋๋ผ rxjs๋ฅผ ํตํด ๋ณ๊ฒฝ ์ฌํญ์ ๊ตฌ๋ ํ๋ API์ ๋๋ค. angular.http์ ๋ผ์ฐํฐ๊ฐ ์ต์ ๋ฒ๋ธ์ ์ ๊ณตํ๋ ๊ฒฝ์ฐ ์ ๋ ฅ ๋ณ๊ฒฝ ์ฒ๋ฆฌ๊ฐ ์ ๊ณตํ์ง ์๋ ๊ฒ์ด ๋งค์ฐ ์ด์ํฉ๋๋ค. ์ฝ๋ฐฑ ๋ฐ RxJ์ ์ธ๊ณ๋ฅผ ํตํฉํ๋ ค๋ฉด ๋๋ฌด ๋ง์ ๋ณด์ผ๋ฌ ํ๋ ์ดํธ๊ฐ ํ์ํฉ๋๋ค.
์์ ์๋ฆฌํ ์๋ฃจ์ ์ค ์ผ๋ถ๊ฐ ๋ง์์ ๋ค์ง ์๋๋ค๋ ๊ฒ์ ์๋์ง๋ง ๋๋ก๋ 'ํ์ค' ๋ฐฉ์์ ์ฝ๊ฐ๋ง ์ฌ๊ตฌ์ฑํ๋ฉด ๋ช ํ์ฑ/์ํฌ๋ฅธ ๋ถ์กฑ์ด๋ผ๋ ์ค์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ์ ์ถฉ๋ถํฉ๋๋ค. ๊ฒ๋ค๊ฐ ๋๋ ์ฌ์ ํ ์ธ์ ๊ฐ ์ด๊ฒ์ ํ ์์ด๋น ์ดํ์ '๊ณต์์ ์ธ' ๋ฐฉ๋ฒ์ ๊ธฐ๋ํ๊ณ ์์ต๋๋ค.
@Input('isOuterPanel')
set isOuterPanel(value: CheckoutPanelHeaderSettings)
{
this.inputs.outerPanel$.next(value);
}
@Input('config')
set config(value: CheckoutPanelHeaderSettings)
{
this.inputs.config$.next(value);
}
// observables for <strong i="6">@Inputs</strong>
inputs = {
config$: new BehaviorSubject<CheckoutPanelHeaderSettings>(1),
outerPanel$: new BehaviorSubject<CheckoutPanelHeaderSettings>(1)
};
๊ทธ๋ฐ ๋ค์ combineLatest(this.service.magicInput$, this.inputs, config$)......
์ ๊ฐ์ ๊ฒ์ ์
๋ ฅํ์ฌ RxJS์ ์
๋ ฅ์ ๊ฒฐํฉํ ์ ์์ต๋๋ค.
BehaviorSubject
๋๋ ReplaySubject
์๋ํฉ๋๋ค. BehaviorSubject๋ ์ผ๋ฐ์ ์ผ๋ก ๋ ์์ ํ๊ณ ์์ธก ๊ฐ๋ฅํฉ๋๋ค.
์ด๊ฒ์ ์ฝ๋๋ฅผ ๋ช
ํํ๊ฒ ํ๋ ๋ฐ ๋์์ด ๋ ๋ฟ๋ง ์๋๋ผ ๋ชจ๋ ์
๋ ฅ์ ํจ๊ป ๊ทธ๋ฃนํํ๊ธฐ ๋๋ฌธ์ this.inputs.
ํ๊ณ ์๋ ์์ฑ์ ๊ฐ์ ธ์ด์ผ๋ก์จ '์์ํ' ๊ด์ฐฐ ๊ฐ๋ฅํ ์
๋ ฅ์ด ๋ฌด์์ธ์ง ์ฝ๊ฒ ํ์ธํ ์ ์์ต๋๋ค.
์ด๊ฒ์ผ๋ก ์ ํ ์์ ์ฑ์ ๋ ๋์ผ ์ ์์ต๋๋ค(๋๋ถ๋ถ ์ด๊ฒ์ ๋จ์ง ์ฌ๋ฏธ๋ฅผ ์ํ ๊ฒ์ ๋๋ค).
// define this globally to 'unwrap' a property 'inputs' with an object of ReplaySubject / BehaviorSubject
export type InputTypes<T extends { inputs: { [key: string]: ReplaySubject<any> | BehaviorSubject<any> } }> = {
[P in keyof T['inputs']]: T['inputs'][P] extends Observable<infer X> ? X : unknown;
}
// define a local 'InputType' helper above each component
type InputType = InputTypes<CheckoutSmartHeaderComponent>;
๊ทธ๋ฌ๋ฉด @Input ์์ฑ์ ์ ํ์ ๋ช ์์ ์ผ๋ก ์ง์ ํ ํ์๊ฐ ์์ต๋๋ค.
@Input('config')
set config(value: InputType['config$'])
{
this.inputs.config$.next(value);
}
๊ตฌ์ฑ ์์๊ฐ inputs
๋ฅผ ์ ์ฉํ๋๋ก ObservableInputs ์ธํฐํ์ด์ค๋ฅผ ๋ง๋ค ์๋ ์์์ง๋ง, ์ด๊ฒ์ ๋ง์ณ๋์ผ๋ฉด ์ด์จ๋ ์ปดํ์ผ๋์ง ์์ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๊ทธ๋ ๊ฒ ํ์ง ์๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค.
@simeyla ๋๋ฌด ๋ง์ ์์ฉ๊ตฌ.
๋๋ ๋ด ์์ ์ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ๊ฑฐ๊ธฐ์ ๋๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค. ๋ด ์ฒซ ๋ฒ์งธ npm ํจํค์ง์ด๋ฏ๋ก ๋๋ฝ๋ ๊ฒ์ด ์๋ค๊ณ ํ์ ํ์ง๋ง ์ฌ๊ธฐ์ ์์ต๋๋ค. https://www.npmjs.com/package/@ng-reactive/async -input
npm install @ng-reactive/async-input --save
import { Component, Input } from '@angular/core';
import { AsyncInput } from '@ng-reactive/async-input';
import { BehaviorSubject } from 'rxjs';
@Component({
selector: 'app-hello',
templateUrl: './hello.component.html',
styleUrls: ['./hello.component.css']
})
export class HelloComponent {
@Input() name: string;
@AsyncInput() name$ = new BehaviorSubject('Default Name');
constructor() {
this.name$.subscribe(name => console.log('from async input', name));
}
}
@ mfp22 ์ ๋ง ์ข์ต๋๋ค. ์ด๋ฐ ๊ฒ์ด ๋ด์ฅ๋์ด์๋ ์๋๋ ์ด์ ๊ฐ ์์ต๋๋ค. ์ฐธ๊ณ ๋ก, ํจํค์ง์ ๋ํ npm์ github ๋งํฌ๊ฐ ์ค๋๋์์ต๋๋ค. ์ฌ๊ธฐ๋ก ์ด๋ํฉ๋๋ค.
https://github.com/mfp22/async-input/tree/master/projects/async-input
๋๋ ์ด๊ฒ์ด ๊ฝค ์ค๋๋ ๋ฌธ์ ๋ผ๋ ๊ฒ์ ์์ง๋ง ๊ทธ ๊ธฐ๋ฅ์ ๊ฝค ๋๋๊ณ Angular์์ ๊ทธ๊ฒ์ ๋ณด๊ฒ ๋์ด ์ ๋ง ๊ธฐ์ฉ๋๋ค.
๋ ๋ฉ์ง ๊ฒ์ ๊ด์ฐฐ ๊ฐ๋ฅํ ์
๋ ฅ์ ์ฌ์ฉํ๋ฉด OnChanges
ํํฌ๊ฐ ํ์ํ์ง ์๋ค๋ ๊ฒ์
๋๋ค. pairwise
rxjs ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ด์ฐฐ ๊ฐ๋ฅํ ์
๋ ฅ์ ์ด์ ๋ฐ ํ์ฌ ๊ฐ์ ์ป์ ์ ์์ต๋๋ค.
@Component({...})
class MyReactiveComponent {
@ObservableInput() prop: Observable<string>; // Whatever syntax may be...
// emits [prevValue, currValue] and no OnChanges hook yay!!
propChanges$ = this.prop.pipe(pairwise());
}
https://github.com/rx-ts/ngrx/blob/master/src/utils/decorators.ts#L56 -L124
์ ๊ฐ์ธ์ ์ธ ๊ตฌํ์ผ๋ก ์๋ฒฝํ๊ณ ์์ฃผ ํ๋ฅญํ๊ฒ ์๋ํฉ๋๋ค. ๋ด์ฅํ ์ ์๋ค๋ฉด ์ ๋ง ๋ฉ์ง ์ผ์ ๋๋ค.
๋ด ํ๋ก์ ํธ์์ ๊ฐ์ธ์ ์ผ๋ก ์ฌ์ฉํ ์๋ฃจ์ ์ npm ํจํค์ง๋ก ๊ฒ์ํ์ต๋๋ค.
https://github.com/futhark/ngx-observable-input
npm install ngx-observable-input
...
<image-item [url]="currentImageUrl"></image-item>
import { Component, Input } from "@angular/core";
import { ObservableInput } from "ngx-observable-input";
import { Observable } from "rxjs";
@Component({
selector: "image-item",
template: `<img [src]="url$ | async" />`
})
export class GalleryComponent {
@ObservableInput() @Input("url") public url$: Observable<string>;
...
}
๋๋ ์ด๊ฒ์ด ๊ฝค ์ค๋๋ ๋ฌธ์ ๋ผ๋ ๊ฒ์ ์์ง๋ง ๊ทธ ๊ธฐ๋ฅ์ ๊ฝค ๋๋๊ณ Angular์์ ๊ทธ๊ฒ์ ๋ณด๊ฒ ๋์ด ์ ๋ง ๊ธฐ์ฉ๋๋ค.
๋ ๋ฉ์ง ๊ฒ์ ๊ด์ฐฐ ๊ฐ๋ฅํ ์ ๋ ฅ์ ์ฌ์ฉํ๋ฉด
OnChanges
ํํฌ๊ฐ ํ์ํ์ง ์๋ค๋ ๊ฒ์ ๋๋ค.pairwise
rxjs ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ด์ฐฐ ๊ฐ๋ฅํ ์ ๋ ฅ์ ์ด์ ๋ฐ ํ์ฌ ๊ฐ์ ์ป์ ์ ์์ต๋๋ค.@Component({...}) class MyReactiveComponent { @ObservableInput() prop: Observable<string>; // Whatever syntax may be... // emits [prevValue, currValue] and no OnChanges hook yay!! propChanges$ = this.prop.pipe(pairwise()); }
์ด๊ฒ์ ๋ํ ์ ์ ๋์ ๋๋ฅผ ๊ดด๋กญํ๋ ๋ฌธ์ ์ด๋ฏ๋ก ์กฐ๊ธ ์กฐ์ฌํ๊ณ ์ฌ๊ธฐ์์ ์ธ๊ธํ ๊ฒ๊ณผ ๋์ผํ ์๋ฃจ์ ์ ์๊ฐํด ๋์ต๋๋ค(@gund).
๋ด๋ถ์ ์ผ๋ก @Input
๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ํ์ฅํ๊ณ ์ด๋ฌํ ์ข
๋ฅ์ ๊ตฌ์ฑ์ ํ์ฉํ๋ ์์ ๋ฐ์ฝ๋ ์ดํฐ ๋์ฐ๋ฏธ( @ObservableInput
)๋ฅผ ๊ตฌํํ์ต๋๋ค. ์ฌ๊ธฐ์์ ํ์ธํ ์ ์์ต๋๋ค( npm ํจํค์ง๋ก๋ ์ฌ์ฉ ). ๊ฐ๋จํ ์์ ๋ก ํ
์คํธํด ๋ณด์์ง๋ง ํ์ฅ ํ๋ก์ ํธ์ ์ฌ์ฉํ ์๊ฐ์ด ์์์ต๋๋ค. ์ด๋ค ํผ๋๋ฐฑ์ด๋ ํ์ํฉ๋๋ค :)
์ฌ์ฉ ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
@Component({
selector: 'app-test',
template: `<span>{{ message$ | async }}</span>`
})
class TestComponent {
@ObservableInput<number>('price') price$: Observable<number>;
@ObservableInput<string>('name') name$: Observable<string>;
message$ = combineLatest(this.price$, this.name$).pipe(
map(([price, name]) => `${name} costs {price}`)
);
}
๊ทธ๋ฆฌ๊ณ ์ด ๊ตฌ์ฑ ์์๋ ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ ์ ์์ต๋๋ค.
<app-test [price]="price"
[name]="name">
</app-test>
@aleics ์ด๊ฒ์ด AOT ์ปดํ์ผ๋ฌ์ ํจ๊ป ์๋ํ ๊ฒ์ด๋ผ๊ณ ํ์ ํฉ๋๊น?
@aleics ์ด๊ฒ์ด AOT ์ปดํ์ผ๋ฌ์ ํจ๊ป ์๋ํ ๊ฒ์ด๋ผ๊ณ ํ์ ํฉ๋๊น?
์๋์, ๋ฌผ๋ก @Input
์์ฑ์ด ๋ช
์์ ์ผ๋ก ์ ์๋์ง ์์๊ธฐ ๋๋ฌธ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์น ๊ตฌ์ฑ ์์๋ฅผ ์ฌ์ฉํ ๋์ ๊ฐ์ด CUSTOM_ELEMENTS_SCHEMA
์ฌ์ฉํ์ฌ ๋ชจ๋์ ์ ์ํ ๋ค์ ์ปดํ์ผํด์ผ ํฉ๋๋ค.
๐คฆโโ ๊ณต๊ฐ๋์ง 5๋ ์ด ๋ ์ด๋ฒ ํธ์ ๋๋ค. ๋ฐ์ํ ํ๋ก๊ทธ๋๋ฐ ์ ๊ทผ ๋ฐฉ์์ ์ฉ์ดํ๊ฒ ํ๊ธฐ ์ํด ์ด๊ฒ์ด ํ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
Ivy๊ฐ ๋๋์ด ๋์๋ค์. ๋๊ตฐ๊ฐ ์ด ์์ ์ ํ ์๊ฐ์ด ์์ ๊ฒ ๊ฐ์๋ฐ์? ์ ๋ฐ ์ ๋ฐ ์ ๋ฐ!
Omg ๋๋ ์ด๊ฒ์ด ๋งค์ฐ ํ์ํ๋ค๊ณ ๊ตฌ๋ ํฉ๋๋ค. ์ ๋ ฅ ๋ฐ์ดํฐ๋ ๋ฐ์ ์์ค๋ก ๋ด๋ณด๋ด์ผ ํ๋ฉฐ ngOnChanges์์ ์๋ํ๋๋ก ํ๋ ค๋ฉด ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
์ด๊ฑฐ ์ง์ง ๊ธฐ๋๋๋ค
Angular๊ฐ ์คํ ์์ค๋ผ๋ ๊ฒ์ ์๊ณ ์์ง๋ง Google์์ ์คํํ๋ ํ๋ก์ ํธ๊ฐ 5๋ ์ด๋ด์ ๋ง์ ๋ณํ ๋ฐ ์์ฒญ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ด์ผ ํ๋ค๊ณ ์๊ฐํ๋ ๊ฒ์ด ์๋ชป๋์๊ฑฐ๋ ์์งํ ๊ฒ์ ๋๊น? Google์ด Angular์์ ์์ ํ ๋ ๋ง์ ๊ฐ๋ฐ์๋ฅผ ๊ณ ์ฉํ์ง ๋ชปํ๋๋ก ๋ฐฉํดํ๋ ์ผ๋ถ ์ฌ์ ์ ๋ฌธ์ ๊ฐ ์์ต๋๊น?
@etay2000 ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. rxjs๋ฅผ ์ฌ์ฉํ์ฌ Angular์์ ์์ ์ 75%๋ฅผ ์ํํ ๋ค์ ๊ธฐ๋ณธ์ ์ด๊ณ ์ผ๋ฐ์ ์ผ๋ก ๊ตฌ์ฑ ์์ ์ ๋ ฅ์ผ๋ก ์ฌ์ฉ๋๋ ๊ฒ์ ๋ํด ๊ฐ์๊ธฐ ์ ์ฐจ๋ฅผ ์ํํด์ผ ํ๋ ๋ฐฉ๋ฒ์ด ์ข ์๊น๋๋ค. ์ธ๊ณ. ๊ด์ฐฐ ๊ฐ๋ฅ ํญ๋ชฉ์ ์ธ๊ณ์ ์๋ํ ์ ์๋ ์ด ์ค์ํ ํ๋ก์ ํธ ๋ถ๋ถ์ด ํญ์ ์์ผ๋ฏ๋ก ํญ์ ์์ฉ๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ ๊ฒฐํฉํด์ผ ํฉ๋๋ค. ํ๋ก์ ํธ์ ๋ํ ์์ ํ ๊ธฐ๋ฅ์ ์ ๊ทผ ๋ฐฉ์์ ์ ๋ ๋ฌ์ฑํ ์ ์์ต๋๋ค. 4๋ ๋์ ๊ณต๊ฐ๋ ์ด ๋ฌธ์ ๋ ์ ๋ฅผ Angular์์ ๋ค๋ฅธ ํ๋ ์์ํฌ๋ก ๋ชฐ์๋ฃ์ ์ค์ฉ์ฃผ์์ ๋ถ์กฑ์ ์๊ธฐ์์ผ์ค๋๋ค. ์๋ํ๋ฉด ๊ฝค ์ ์ฉํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ชจ๋ ๊ฒ์ rxjs๋ฅผ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด cycle.js๊ฐ ๋ ๋์ ์๋ฃจ์ ์ผ ์ ์๊ณ , rxjs๋ฅผ ์ ํ ์ฌ์ฉํ์ง ์์ผ๋ ค๋ฉด Vue๊ฐ ๋ ์ ์์ต๋๋ค. Observable์ ์ ๋ฐ์ ์๊ฐ ๋์ ์ฌ์ฉํ๊ณ ๋๋จธ์ง ์ ๋ฐ์ ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์ ์๋ฏธ๊ฐ ์์ต๋๋ค. ๋งค์ฐ ๊ฐ๋ ฅํ ์ถ์ํ๋ฅผ ๋์ ํ์ต ๊ณก์ ๊ณผ ํตํฉํ ๋ค์ ์์ ํ ํตํฉํ์ง ๋ชปํ๋ ๊ฒ์ ๋นํน์ค๋ฌ์ธ ๋ฟ์ ๋๋ค.
์ฐ์ ์์์ ์ฌ์ฌ์ด ์ด๋ฐ ์์ผ๋ก ๊ฐ๋ ๊ฒ ๊ฐ์
๋ด๋ถ Google ์ฌ์ฉ์์ ์๊ตฌ ์ฌํญ -> ๋ ๋น ๋ฅธ ์ปดํ์ผ๋ฌ์ ๊ด๋ จ๋ ๋ชจ๋ ๊ฒ -> ๋ ์์ ์ฑ ํฌ๊ธฐ์ ๊ด๋ จ๋ ๋ชจ๋ ๊ฒ -> ์ ๊ท ์ฌ์ฉ์๋ฅผ ํ๋๊ฒ ํ์ง ์๋ ๋ชจ๋ ๊ฒ -> ๊ฐ๋ฐ์๊ฐ ์ค์ ๋ก ์ํ๋ ๊ฒ
๊ธฐ์ ๋ฆฌ๋๋ ์ด๊ฒ์ด ์ค์ํ๋ค๋ ๋ฐ ๋์ํ์ง๋ง ์ฌ์ค Igor์ Misko๋ ํ ํ๋ฆฟ ์ปดํ์ผ, ๋ทฐ ๋ฐ์ธ๋ฉ ๋ฐ ๋ ๋๋ง ์ธก๋ฉด์์ ๋๋ถ๋ถ์ ๋ฌธ์ ์ ๋ํด ์๊ฐํ๋ ๊ฒฝํฅ์ด ์์ต๋๋ค. Angular์ ์๋น์๊ฐ ์ค์ํ๋ค๊ณ ๋งํ๋ ๊ฒ๊ณผ ์๊ด์์ด ์๋ฃจ์ ์ ํญ์ ํ ํ๋ฆฟ ์์คํ ์ ๋ณ๊ฒฝํ๊ฑฐ๋ ์ ๋ ๋๋ฌ๋ฅผ ์์ฑํ๊ฑฐ๋ ์ปดํ์ผ๋ฌ๋ฅผ ๋ ์ข๊ฒ ๋ง๋๋ ๊ฒ์ ๋๋ค.
์ถ์ฒ: https://medium.com/@jeffbcross/jeffs-letter-to-the-angular-team-and-community-5367934a16c9)
๊ฐ์ฅ ๋ง์ด ํฌํ๋ ๋ฌธ์ ๋ฅผ ์ดํด๋ณด์ญ์์ค.
5๋ ์ ์์ฑ, ๊ด๋ จ ํ์์ ๋ง์ง๋ง ํ์ - 5๋ ์ , ํ์ฌ ์ํ ๋ถ๋ช .
4๋ ์ ์ ์์ฑ๋ ๊ด๋ จ ํ์์ ๋ง์ง๋ง ํ์ - 1๋ ์ , ํ์ฌ ์ํ - Ivy๊ฐ ์๋ฅํ๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ณ ์์ต๋๋ค.
4๋ ์ ์์ฑ, ๊ด๋ จ ํ์์ ๋ง์ง๋ง ํ์ - 3๋ ์ , ํ์ฌ ์ํ ๋ถ๋ช .
4๋ ์ ์์ฑ, ๊ด๋ จ ํ์์ ๋ง์ง๋ง ํ์ - 2๋ ์ , ํ์ฌ ์ํ ๋ถ๋ช .
as local-val
์์ด *ngIf #152804๋ ์ ์์ฑ, ๊ด๋ จ ํ์์ ๋ง์ง๋ง ํ์ - 2๋ ์ , ํ์ฌ ์ํ ๋ถ๋ช .
4๋ ์ ์์ฑ, ๊ด๋ จ ํ์์ ๋ง์ง๋ง ํ์ - 3๋ ์ , ํ์ฌ ์ํ ๋ถ๋ช .
4๋ ์ ์ ์์ฑ๋์์ผ๋ฉฐ ๊ด๋ จ ํ์์ ๋ง์ง๋ง ํ์ - ํ ๋ฒ๋, ํ์ฌ ์ํ๋ฅผ ์ ์ ์์.
๊ทธ๋ฐ ๋ค์ ๋ ๋์ ์ฐจ์์ ๊ตฌ์ฑ ์์๋ฅผ ํ์ฉํ๋ ๊ตฌ์ฑ ์์ ๊ธฐ๋ฅ๊ณผ ๊ฐ์ ๊ฒ๋ค์ด ์์ผ๋ฉฐ, ๋ฌผ๋ก ๋ ๋ง์ ์ฐฌ์ฑ ํฌํ ๋ฌธ์ ๊ฐ ์์ง๋ง ์ด๋ฌํ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋๊ธฐ๋ฅผ ๋ฐ๋์ต๋๋ค(์ฆ, Ivy ์ดํ ์ฆ์ ๊ตฌํ๋ ๊ฒ์ผ๋ก ๊ธฐ๋ํ์ง ์์๋ ๋ฉ๋๋ค. ), ํ๋ ์์ํฌ ๋ฐ ๋ฐ์์ฑ์ ์ผ์์ ์ธ ์ฌ์ฉ๊ณผ ๊ด๋ จ์ด ์๊ธฐ ๋๋ฌธ์ ์๋ฌด๋ ๋ ผ์ํ์ง ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ด๊ฒ์ ๋๋ถ๋ถ์ ์ฌ๋๋ค์ด ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค(ngrx๊ฐ ๊ฐ์ฅ ์ธ๊ธฐ ์๋ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ ๊ฒฝ์ฐ).
๋ด ์ฑ์ ๋ฐ์ฏค ๊ตฌ์ด(๋จ์ํ ๊ธฐ์ ์ ์ธ ์ ํ์ผ๋ก ์ธํด ์ผ๋ถ๋ ์ฝ์ด์์๋ง ์ ๋๋ก ์ํํ ์ ์์) "ํด๋ฆฌํ"๋ก ๊ฐ๋ ์ฐจ ์๊ณ ์ด๋ฌํ ๋ฌธ์ ์ ๋๋ถ๋ถ์ ํดํนํ์ฌ ์ธ์ ๊ฐ๋ ์ต๊ทค๋ฌ ๋ค์ดํฐ๋ธ์ ๋น ์ง ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ๋ฐ๊ฟ ๋์. ํ์ง๋ง ์ ์ง ์ค์ง ์์ ๊ฒ ๊ฐ๋ค.
์, ๊ฐ์ฅ ํฐ ๋ฐ์์ฑ/๊ฐ๋ฐ์ ๊ฒฝํ ๊ด๋ จ ๋ฌธ์ ์ ์ํ๋ฅผ ๋ค๋ฃจ๋ ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์ด ์ ๋ง ๊ฐ์ฌํ ๊ฒ์ด๋ผ๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค.
์ด ๊ธฐ๋ฅ์ ์ฒซ ๋ฒ์งธ ๋ฒ์ ์ ์ง์ ์ฝ๋ฉํด ๋ณด๋ ๊ฒ์ ์ด๋ป์ต๋๊น? ์ ๋
covid ๋ ์ง๋ฃจํด ์ฃฝ์ด, ๋๊ฐ ๋์ ํจ๊ปํ๊ณ ์ถ์ด?
์๋ฅผ ๋ค์ด ์ฌ๋ฌ ์ฌ๋์ด ์ด๋ฏธ ํ์ต๋๋ค. https://github.com/insidewhy/observable-input
์ด๋ค ๋๋ถ๋ถ์ ๋ฌธ์ ๋ ํจ์จ์ ์ผ๋ก ์ํํ๋ ค๋ฉด ์ปดํ์ผ๋ฌ๋ angular์ ๋ค๋ฅธ ๋ด๋ถ ๋ถ๋ถ์ ์์ ํด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค.
๊ทธ๊ฑด ์ค์ํ์ง ์์ต๋๋ค. ๋ด ๋ง์ ๊ฐ๋์ ์ ์ ํ ๊ธฐ์ฌ๋ฅผ ํ์
ํต์ฌ. ๊ฒฐ๊ตญ, ์ฐ๋ฆฌ๋ ์์ค ์ฝ๋๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ฌ์ค ์ด ๊ฒฝ์ฐ์๋ ์ปดํ์ผ๋ฌ๋ฅผ ๋ง์ง ํ์์กฐ์ฐจ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
@ganqqwerty ํด๋น ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์์ฑํ๊ธฐ ์ ์ Angular ๋ด๋ถ์์ ๊ตฌํํ๋ ค๊ณ ํ์ต๋๋ค. Angular๋ ๋งค์ฐ ๋ณต์กํฉ๋๋ค. ๊ณต์ ํ๊ฒ ๋งํ์๋ฉด, ์ฝ๋๋ React์ 500์ค์ง๋ฆฌ ๋ฏธ์น ๊ธฐ๋ฅ๋ณด๋ค ํจ์ฌ ๋ ์ฝ๊ธฐ ์ฝ๊ณ ์ดํดํ๊ธฐ ์ฝ์ง๋ง "์ ๊ต"ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ด ๊ฐ์น๊ฐ ์๋ค๊ณ ์๊ฐํ๋ค๋ฉด ๋๋ ์ฌ์ ํ ๊ทธ ๊ตฌํ์ ์ํด ๋ ธ๋ ฅ์ ๊ธฐ์ธ์์ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ์์์ @fxck๊ฐ ๋ฐ๋ณต๋ ์ ํํ ์ด์ ๋๋ฌธ์ ๊ฐ์น๊ฐ ์๋ค๊ณ ๋ณด์ง ์์ต๋๋ค. Angular ํ์ ์ปค๋ฎค๋ํฐ์ ๋ง์ ๋ฃ์ง ์๊ณ ์ผ๋ฐ์ ์ผ๋ก Angular์ ์ ์ฉ์ฑ์ ๋ํด ์ ๊ฒฝ ์ฐ์ง ์๊ณ ์ต์ ํ์ ์ฑ๋ฅ์ ์ง์์ ์ผ๋ก ์ง์ฐฉํฉ๋๋ค. ๋๋ 5๋ ์ ์ ์์ฐ๋ ๊ฐ๋จํ ๋ฌธ์ ์ ๋ํด ์์ฉ๊ตฌ๋ฅผ ๊ตฌํํ๋๋ก ๊ฐ์ํ ๋ ์ ์ํ๋๋ ํ๋ ์์ํฌ์ ๋ํด์๋ ์ ๊ฒฝ ์ฐ์ง ์์ต๋๋ค. ๊ทธ๋์ ๋๋ Angular์ ๋ํ ๊ด์ฌ์ ๋ฉ์ถ๊ณ , ๋ด๊ฐ ์ด๋ฏธ ์์ ํ๊ณ ์๋ ํ๋ก์ ํธ๋ฅผ ์ง์ํ๋ ๋ฐ ํ์ํ ์ต์ํ์ ๋ ธ๋ ฅ์ ๊ตฌํํ๊ณ , ๋ฏธ๋์ ๋ชจ๋ ํ๋ก์ ํธ์์ ๊ฐ๋ฅํ๋ฉด ์ธ์ ์ด๋์๋ ์ด๋ฅผ ํผํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค.
์ด๊ฒ์ Angular๋ง์ ๋ฌธ์ ๊ฐ ์๋๋ผ Google์ ๋ง์ ์ ํ์์ ๋ฐ์ํ๋ ๋ฌธ์ ์ ๋๋ค. ์ด ๋ฌธ์ ์ @fxck๊ฐ ์์ ๋์ด๋ ๋ค๋ฅธ ๋ฌธ์ ๋ Google์ ๊ณ ์ ํ ๋ฌธ์ ์ ๋ํ ๋ ๋ง์ ์์ ๋๋ค. Dart ๋๋ GoLang์ ๋ณด๋ฉด ๊ฐ๋ฐ์๊ฐ ์ผ๋ฐ์ ์ผ๋ก ์ง๋ฉดํ๋ ๋งค์ฐ ์ ์๋ ค์ง ๋ฌธ์ ๋ฅผ ์ ๊ธฐํ๊ณ ๋ฌธ์ ๊ฐ 5๋ ์ด์ ์ง์๋๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
๋๋ ์ด๊ฒ์ด ์ถ๊ฐ๋์ด์ผ ํ๋ค๋ ๋ฐ ๋์ํ์ง๋ง, ์์ฐ, ์ด ์ค๋ ๋์ ๋ํ ์ฆ์ค๊ฐ ์กฐ๊ธ ๋ง์ต๋๋ค. ์ ๋ง์ ์ฐ๋ฆฌ๊ฐ ๋ช ์ค์ ์ฝ๋๋ฅผ ์ ์ฝํ ์ ์๋ ๋ฌด์ธ๊ฐ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์๋ค๋ ๊ฒ์ ๋๋ค. ์ด์ @Input์ผ๋ก ์ฅ์๋ setter์ ๊ฐ์ ํธ์ํ๋ ์์ ์ ์ฃผ์ ๋ก ๊ด์ฐฐ ๊ฐ๋ฅํ ์ ๋ ฅ์ ๊ฐ์ง ์ ์์ต๋๋ค.
https://github.com/angular/angular/issues/5689#issuecomment -507001686
๋๋ฌด ๋ง์ ์์ฉ๊ตฌ๋ผ๋ฉด ์ด๋ฏธ ๊ฐ๋จํ ํ์ฌ ์ต์ ์ด ์์ต๋๋ค.
https://github.com/Futhark/ngx-observable-input
์ ๋ Angular์ ๊ฐ๋ฐ์ ๋ง์กฑํ๋ฉฐ ์ด๋ฌํ ์ฌ์ํ(๋ฐ๋์งํ) ๊ธฐ๋ฅ ๋๋ฌธ์ ๋๋๋๋ก ์์ ํ ๊ธฐ๋ฅ๊ณผ ์์ ์ ์ธ ํ๋ ์์ํฌ๋ฅผ ํฌ๊ธฐํ์ง ์์ ๊ฒ์ ๋๋ค.
์ผ๋ฐ์ ์ธ ๋ฌธ์ ๋ ์ฃผ๋ก ์ฌ๋๋ค์ด ๊ทธ๊ฒ์ ๋ณด๋ ๊ด์ ์์์ ๋๋ค. ๋๊ตฐ๊ฐ์๊ฒ๋ ๋ช ์ค์ ์ฝ๋๋ก ๋ฌด์์ด๋ ๋ณ๊ฒฝ/์ถ๊ฐํ๋ ๊ฒ์ด ๋งค์ฐ ๊ฐ๋จํด ๋ณด์ด์ง๋ง ์ค์ ๋ก๋ ๋ ํฐ ๋ฒ์์ ๋ง์ ๋ถ์์ฉ์ด ์์ต๋๋ค. ๊ทธ๋ค ๋ชจ๋๋ ๊ณ ๋ ค๋์ด์ผ ํ๊ณ ํญ์ ๊ทธ๋ ๋ฏ์ด ์ฃผ์ ์ ๋ผ์ธ์ ๊ธธ๊ณ ๋ชจ๋ ๊ฒ์ ์ฝ๊ฐ์ ๋น์ฉ, ๋ถ๊ฐ๊ฐ์น ๋ฐ ์ฐ์ ์์๊ฐ ์์ต๋๋ค.
๊ฐ์ธ์ ์ผ๋ก ์ด๋ฌํ ๋ชจ๋ ๋ฌธ์ ๊ฐ ์ฆ์ ํด๊ฒฐ๋ ๊ฒ์ผ๋ก ๊ธฐ๋ํ์ง๋ ์๋๋ค๋ ์ ์ ์ง์ ํ๊ณ ์ถ์ต๋๋ค.
๊ทธ๋ฌ๋ ์ด์ Ivy๊ฐ ๋ฐฉํด๊ฐ ๋์ง ์๊ณ ์ ์ ๋์ ์ผ์ธ ํ๋์ ํ์ง ์์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ์๋ฅผ ๋ค์ด ์์ 25๊ฐ ์ฐฌ์ฑ ๋ฌธ์ ์ ๋ํ ์ผ์ข ์ ๊ณต์ ์ ๋ฐ์ดํธ๊ฐ ๊ฒ์๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
๋ด ๋ง์, ์ด ๊ท๋ชจ์ ํ๋ก์ ํธ๊ฐ ํ๋ก์ ํธ ๊ด๋ฆฌ์์ ์ต์ฐ์ ์์์ ์์ 25๊ฐ(๋๋ ๋ฌด์์ด๋ ) ํฌํ๋ ๋ชจ๋ ๋ฌธ์ ์ ๋ํ ์ผ์ข
์ ๊ณํ์ ๊ณ ๋ คํ์ง ์์ ์ ์๋ค๋ ๊ฒ์ ์ฐพ์ง ๋ชปํ์ต๋๋ค. ์ด๋ค ์ค ๋๋ถ๋ถ์๋ effort
ํ๊ทธ๋ ์์ต๋๋ค. ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์ ์์ฑํ๊ณ ์ปค๋ฎค๋ํฐ์ ๊ทํ๊ฐ ์ด์ ๋ํด ์๊ณ ์์ผ๋ฉฐ ์ด์ ๋ํ ์ผ์ข
์ ๊ณํ์ด ์์์ ์๋ฆฌ์ญ์์ค.
๋๋ ํ์คํ Angular๋ฅผ ํฌ๊ธฐํ์ง ์์ ๊ฒ์ ๋๋ค. ๋ชจ๋ ๋จ์ ๋๋ฌธ์ ์ฌ์ ํ ๋ค๋ฅธ ๋ชจ๋ ๋์๋ณด๋ค ํจ์ฌ ๋ ์ข์ํฉ๋๋ค. ๊ทธ๋ฌ๋ "์ปค๋ฎค๋ํฐ ๊ด๊ณ ๊ด๋ฆฌ"(ํนํ github์์)๊ฐ ๋ถ์กฑํ๋ค๊ณ ๋งํ๋ ๊ฒ์ด ํ๋นํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
// ํธ์งํ๋ค
์ข์ ์ฌ๋๋ค์ด ์ด ์ค๋ฌธ์กฐ์ฌ๋ฅผ ์์ฑํด ์ฃผ์๊ฒ ์ต๋๊น? ํ์ฌ ์ํฉ๊ณผ ๊ณ ๋ คํ ๋ชจ๋ ์ฌํญ์ ๊ณ ๋ คํ ๋ ์ด๋ฌํ ๋ฌธ์ ์ค ๊ฐ์ฅ ํฐ ์ํฅ์ ๋ฏธ์น๋ ๊ฒ์ / ๊ฐ๋ฐ์ ๊ฒฝํ์ ๊ฐ์ฅ ํฅ์์ํฌ ๊ฒ์ ๋๋ค https://forms.gle/cprhx239kuqwWd5M8
@fxck ์์ฑ
๋๋ ํ์คํ Angular๋ฅผ ํฌ๊ธฐํ์ง ์์ ๊ฒ์ ๋๋ค. ๋ชจ๋ ๋จ์ ๋๋ฌธ์ ์ฌ์ ํ ๋ค๋ฅธ ๋ชจ๋ ๋์๋ณด๋ค ํจ์ฌ ๋ ์ข์ํฉ๋๋ค. ๊ทธ๋ฌ๋ "์ปค๋ฎค๋ํฐ ๊ด๊ณ ๊ด๋ฆฌ"(ํนํ github์์)๊ฐ ๋ถ์กฑํ๋ค๊ณ ๋งํ๋ ๊ฒ์ด ํ๋นํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋๋ ๊ทธ ๋ฌธ์ฅ์ด ๋ด ์๊ฐ์ ์๋ฒฝํ๊ฒ ์์ฝํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
@chriszrc ์ ๋ ์ด ์ค๋ ๋์ ์ด๋ค ๊ฒ๋ '์ฆ์ค'๋ก ํด์ํ์ง ์์์ต๋๋ค. ์ฌ๋๋ค์ด ๋ง์นจ๋ด ํ ๋ฒ์ ๋ช ๋ ๋์ ๋ฌธ์ ๋ฅผ ์ ๊ธฐ์ ์ผ๋ก ๋ฌด์ํ๋ Angular๋ก ์ข์ ๊ฐ์ ํ์ถํ๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค. ํนํ ์ด ๋ฌธ์ ์ ๊ดํ ๊ฒ์ด ์๋๋ผ ์ด๋ค ํํ์ ์ปค๋ฎค๋ํฐ ์ํธ ์์ฉ์ ์ ์งํ๋ ์์น์ ๊ดํ ๊ฒ์ ๋๋ค. Angular ํ์ด ๋ชจ๋ ์ฌ๋์๊ฒ ๊ฐ์ฅ ์ข์ ๊ฒ์ด ๋ฌด์์ธ์ง ์๊ณ ์๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฐ์ ์์ฒญ์ ๋ฌด์ํ ์ ์๋ค๊ณ ์๊ฐํ ์ ๋๋ก ๋ค๋ฅธ ๋๊ตฌ๋ณด๋ค ํจ์ฌ ๋ฐ์ด๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๊น?
@chriszrc ์ด ์ค๋ ๋์๋ ์ฆ์ค๊ฐ ์ ํ ์๊ณ ์ดํดํ ์ ์๋ ์ข์ ๋ง @fxck ๊ฐ ์์์ ์ ๊ธฐํ ๋์ค์ ์ธ ๋ฌธ์ ์ ์ค์ํ ๋ชจ์์ด ๋ฌด์๋์์ต๋๋ค.
์๋ ํ์ธ์ ์ฌ๋ฌ๋ถ, ์ด ์ค๋ ๋์ ์นจ๋ฌต์ ๋ํด ์ค๋กํฉ๋๋ค. ํ๋์ ์ฐ๋ฆฌ๊ฐ ๋ฐ์์จ ๋ ๊ฐ์ง ์ง๊ต ์์ฒญ์ด ์์ต๋๋ค.
๋ ์์ฒญ ๋ชจ๋ ์ฐ๋ฆฌ์ ๋ ์ด๋์ ์์ผ๋ฉฐ ๋ ๋ค ์ฅ๋จ์ ์ด ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ฒซ ๋ฒ์งธ ๋ฐฉํฅ์ผ๋ก ๊ฐ๋ฉด ํํ๋ ฅ์ด ํ๋ถํ๊ณ ์๋ฏธ๊ฐ ํ๋ถํ RxJS API๋ฅผ ์ฒ์ ์ ํ๋ ์์ง๋์ด๊ฐ ํ๋ ์์ํฌ์ ์ ๊ทผํ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ค ๊ฒ์ ๋๋ค. ๋ง์ ์ฌ๋๋ค์ด Angular ์ฑ์ ๋ชจ๋ ๊ณณ์์ RxJS๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋ํด ์ฐ๋ คํ๊ณ ์์ด ๊ฒฝํ ์์ค์ด ๋ค๋ฅธ ํ์๋ค์ด ์์ค ์ฝ๋๋ฅผ ์ฝ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ญ๋๋ค.
๋์์ ์ฐ๋ฆฌ๋ ์ด๋ฏธ ๋ง์ ๋ฐ์ํ API๋ฅผ ๊ฐ์ง๊ณ ์์ง๋ง Angular์์ ์ ๊ณตํ๋ ์ผ๋ถ ๊ธฐ๋ณธ ์์๋ ์์ ํ ํ์์ ์ด๋ฉฐ ๋ชจ๋ ๊ฒ์ด ์ ์ฐ๊ฒฐ๋์ง ์์ต๋๋ค. ์ฆ, ๋ฐ์์ฑ ์ง์์ ๊ฐ์ ํ๋ ๊ฒ์ด ์ด์น์ ๋ง์ง๋ง ์ด๊ฒ์ด Angular ํต์ฌ์ ์ผ๋ถ์ด๊ฑฐ๋ ์ฐ๋ฆฌ๊ฐ ๊ธด๋ฐํ๊ฒ ํ๋ ฅํ๋ ์ปค๋ฎค๋ํฐ ํ๋ก์ ํธ(์: ngrx - Angular์ ๋ฐ์ ํ์ฅ)์ ์์๋์ด์ผ ํฉ๋๊น?
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์์ง๋ง ๋ค์์ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
์ฐ๋ฆฌ๋ ๊ฐ์ฅ ๋ง์ด ์์ฒญ๋๊ณ ์ฐ๋ฆฌ๊ฐ ํด๊ฒฐํ ์ ์๋ ์ํฅ๋ ฅ ์๋ ๊ฐ์ ์ฌํญ์ ์ดํด๋ณด๊ณ ๋ช ๊ฐ์ง ์ฃผ์ GitHub ๋ฌธ์ ์ ์ฐ์ ์์๋ฅผ ์ง์ ํ๋ ๊ณผ์ ์ ์์ต๋๋ค. ๋๋ ์ด๊ฒ์ด ๋ ๋์ ์ ์ธ ๊ฒ ์ค ํ๋๋ผ๊ณ ๋งํ๊ณ ์ถ์ต๋๋ค. ๊ทธ๋์ ๋ ์ง๋ฅผ ์ฝ์ํ๊ธฐ๊ฐ ์ด๋ ต์ต๋๋ค.
@mgechev ์๋ต
rxjs์ ๋ฐ์ํ API๊ฐ ๋ค๋ฅธ ํ์ฅ ํ๋ก๊ทธ๋จ์ผ๋ก ๋ถํ ๋๋ ๊ฒฝ์ฐ(๋ด ๊ฐ์ธ ํฌํ๊ฐ ์๋)
๋๋ ๊ทธ๊ฒ์ด ์ผ์ด๋ ๊ฒ์ด๋ผ๊ณ ๋งํ๋ ๊ฒ์ด ์๋๋๋ค. ๋ด ์๊ฒฌ์์ ๋๋ ํ๋ก์ ํธ์ ๋ฒ์์ ์ฐ๋ฆฌ๊ฐ ๊ฐ์ง ๋ค์ํ ๊ณ ๋ ค ์ฌํญ์ ๋ณด์ฌ์ค ์ ์๋๋ก ๋ถ์์ ํ ๋์ ๋ชฉ๋ก์ ๊ณต์ ํ๊ณ ์์ต๋๋ค.
@mgechev ์ ๋ง ๋ต๋ณ ๊ฐ์ฌํฉ๋๋ค.
๊ทธ๋ฌ๋ Angular์ ๋ฆฌ์กํฐ๋ธ ๋ถ๋ถ์ด ์ปค๋ฎค๋ํฐ ํ๋ก์ ํธ๋ก ์ด๋ป๊ฒ๋ "๊ฐ๋ฑ"๋๋ค๋ฉด ๋ฆฌ์กํฐ๋ธ๊ฐ Angular์ 2๊ธ ์๋ฏผ์ด ๋๋ค๋ ๋ป์ด ์๋๊น์?
@mgechev ๋น์ ์ ๊ณ ํต์ด ํ ๋ฒ์ ๋ ๋ฐฉํฅ์ผ๋ก ์ฐข์ด์ง๋ ๊ฒ์ ๋๋๋๋ค. ์ฐ๋ฆฌ ํ์ ์ค์ ๋ก ๋ช ๋ นํ/๋ฐ์ํ ์กฐ๊ฐ์ ๋๋๋ ๊ฒ์ ๋ฐ๋ํ์ง ์์ต๋๋ค.
์ด๋ฌํ ๋ถํ ์ ๋ํ ์๊ตฌ ์ฌํญ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์์ ๋ด์ฉ์ ๊ธฐ๋ฐ์ผ๋ก:
๋๋ ์์ ๋ด์ฉ์ด ์ฐ๋ฆฌ์ ์ธ๊ณ๊ด์ด๋ฉฐ ๋ค๋ฅธ ์ฌ๋๋ค๋ ๋ง๋ค๋ ๊ฒ์ ์ดํดํฉ๋๋ค. ์ด ๊ธ์ ์ฐ๋ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๊ธฐ๋ฅ์ ์ถ๊ฐํด์ฃผ์ธ์
@mgechev ๋๋ ๋น์ ์ ๊ฑฑ์ ์ ์ดํดํ์ง ๋ชปํฉ๋๋ค. ์ด ์ ์์ ๋ ์ธ๊ณ๋ฅผ ์ด๋ณด์ ๊ฐ๋ฐ์ ์ธํฐํ์ด์ค๋ก ํต์ผ๋๊ณ ์ง๊ด์ ์ผ๋ก ๊ฒฐํฉํ๋ ๊ฒ์ ๊ดํ ๊ฒ์
๋๋ค. ๋ ์ค ํ๋๋ฅผ ์ ํํ๋ ๊ฒ์ด ์๋๋ผ ์กฐํฉ์ ๊ฐ๋ฅํ๊ฒ ํ๋ ๊ฒ์
๋๋ค. ์๋ฅผ ๋ค์ด ๊ฐ๋ฐ์ x๋ ๋ฉ์ง ๋ฐ์ํ ๊ตฌ์ฑ ์์๋ฅผ ๋น๋ํ๊ธฐ๋ก ๊ฒฐ์ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ๋ฐ์ y๋ ๊ทธ๋ค์ง ๋ฐ์์ ์ด์ง ์์ ํ๋ก์ ํธ์์ ๊ทธ๊ฒ์ ์ฌ์ฉํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค. ์ ์ ๋ผ? ์ ๊ทธ๋ ngrx ์ ์ฐฉ์ ์ ์์กดํด์ผ ํฉ๋๊น?
๋ ์ธ๊ณ์ ์ฐจ์ด์ ์ ๊ถ๊ทน์ ์ธ ์ค๋งํธ ๊ตฌ์ฑ ์์์ ์ค์ ์ํ ์ ์ฅ์์ ์ํ๋ฅผ ์ ์ฅ/๊ด๋ฆฌํ๋์ง ์ฌ๋ถ์ด๋ฉฐ ์ด๊ฒ์ด ngrx๊ฐ ์์ด์ผ ํ๋ ๋ถ๋ถ์ด์ง๋ง ๊ตฌ์ฑ ์์์ ๊ฒฝ์ฐ ํ๋ ์์ํฌ ์์ฒด๊ฐ ์ธ์์ด๋ธ๋ฌ์ฌ์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
ํ๋์ ์ฐ๋ฆฌ๊ฐ ๋ฐ์์จ ๋ ๊ฐ์ง ์ง๊ต ์์ฒญ์ด ์์ต๋๋ค.
- ํ๋ ์์ํฌ์์ ๋ ๋์ ์ผ๊ธ RxJS ์ง์
- Angular์ RxJS๊ฐ ์ ์ด ์ ์ฌ์ ์ผ๋ก ์ ํ ์ฌํญ์ด ๋ฉ๋๋ค.
์ด๋ ์ชฝ์ด๋ ๊ด์ฐฎ์ง๋ง ๋๋๋ก ์ด๊ฒ์ ๋ฐฐํฐ๋ฆฌ๊ฐ ํฌํจ๋ ํ๋ ์์ํฌ๋ฅผ ์ ์ธํ๊ณ ๋ ๋ง์ง๋ง ์์ ์ธ Angular์ ๋ถ๋ฆฌ๋ ๋๋์ ์ฃผ๊ธฐ๋ ํฉ๋๋ค.
๊ฐ์ธ์ ์ผ๋ก ๋ชจ๋ Angular ํจํค์ง(HTTP, Router, Forms)์ ๋ํด ๋น RxJS ๋ฒ์ ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด ๊ถ๊ธํฉ๋๋ค. ๋๋ ์ด๊ฒ๋ค์ ์ข์ ๋น RxJS ๋ฒ์ ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด๊ฒ์ด ๊ทธ๋ค์ด ์ฒ์์ RxJS๋ฅผ ๊ฐ์ง๊ณ ์๋ ์ด์ ์ ๋๋ค.
์ฆ....๋ด๊ฐ ๋ญ๊ฐ๋ฅผ ๋์น๊ณ ์์ง ์๋ ํ, (2)๋ ์คํ ๊ฐ๋ฅํ์ง ์์ต๋๋ค.
์ถ์ ์ ๋ ์ด๋ฌํ ์์ฒญ์ "์ง๊ต"๋ผ๊ณ ์ค๋ช ํ์ง ์์ต๋๋ค. "๋ฐ๋"์ ๋ ๊ฐ๊น์ต๋๋ค.
Angular์ RxJS๊ฐ ์ ์ด ์ ์ฌ์ ์ผ๋ก ์ ํ ์ฌํญ์ด ๋ฉ๋๋ค.
@mgechev์ ๋ํ ํธ๊ธฐ์ฌ์ผ๋ก Github ๋ฌธ์ ๊ฐ ์์ต๋๊น? (๋๋ ๋ณธ ์ ์ด ์์ต๋๋ค.) ์๋๋ฉด ์ด๊ฒ์ ๋ Google ์ง์์ ๊ฒ์ ๋๊น?
@pauldraper github์์ ๋๊ตฐ๊ฐ๊ฐ rxjs๊ฐ ์ผ๋ง๋ ๋์ฐํ๊ฒ ๋ณต์กํ์ง์ ๋ํด ๋ถํํ๊ณ ์์ ํ ์ ํ ์ฌํญ์ด ๋๊ธฐ๋ฅผ ์ํ๋ ๋ฌธ์ ๋ฅผ ์ ์ด๋ ํ๋๋ ๋ณด์์ต๋๋ค. ๊ฐ์ธ์ ์ผ๋ก ๋๋ rxjs๋ฅผ ์ข์ํ์ง๋ง ๋ ํ๊ณผ ํจ๊ป ์ผํ๋ฉด์ ์ฃผ๋์ด์ ์๋์ด ๊ฐ๋ฐ์ ๋ชจ๋์๊ฒ ๋๋ ค์๊ณผ ํ์ค๊ฐ์ ๋ถ๋ฌ์ผ์ผ์ผฐ์ต๋๋ค. ๋ํ ์ง๊ต๋ ๋ฐ๋๋ณด๋ค ๋ ๋์ ์ฉ์ด์ ๋๋ค. ๋ ์์ฒญ์ ๋์์ ๊ตฌํํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค(๊ฐ ์๋ฃจ์ ์ ๋ฐ์์ ์ด๊ณ ๋ช ๋ น์ ์ผ๋ก ์๋นํ๋ ์ฌ๋ฌ API ์ต์ ์ ์ ๊ณตํ์ฌ ๋ค๋ฅธ ์๋ฃจ์ ์ ๋ฐฉํดํ์ง ์๊ณ ์๋ํ ์ ์์).
github์ rxjs์ ๋ํด ๋ถํํ๋ ๋ชจ๋ ๋๊ธ์๋ ์์ฒ ๋ช ์ ๊ฐ๋ฐ์๊ฐ ๋ฌธ์ ์์ด ์ฌ์ฉํ๊ณ ์ฆ๊ธฐ๊ณ ์์ ๊ฒ์ ๋๋ค.
๋ค์ ์ Angular discord์์ ํ ๋ก ํ๋ฉด์ ์์ ๊ฒ์ํ ์์์ ๊ฒฐ๊ณผ์ ๋๋ค(๊ฑฐ์ 200๋ช ์ด ์๋ตํ์ต๋๋ค).
๋น์ฐํ ํํ๊ฐ ๊ฐ์ฅ ํฐ ๊ณจ์นซ๊ฑฐ๋ฆฌ ์ง๋ง ๋ถ๋ช ํ @MikeRyanDev ๊ฐ ๋ง์นจ๋ด ๋ฌด์ธ๊ฐ๋ฅผ ์๋ฆฌํ๊ณ ์์์ง๋ ๋ชจ๋ฆ ๋๋ค .
github์ rxjs์ ๋ํด ๋ถํํ๋ ๋ชจ๋ ๋๊ธ์๋ ์์ฒ ๋ช ์ ๊ฐ๋ฐ์๊ฐ ๋ฌธ์ ์์ด ์ฌ์ฉํ๊ณ ์ฆ๊ธฐ๊ณ ์์ ๊ฒ์ ๋๋ค.
๋๋ rxjs๋ฅผ ์ฌ๋ํ์ง๋ง ๊ทธ๋ ๊ฒ ๋๊ด์ ์ด์ง๋ ์์ต๋๋ค. ๋๋ ๊ฐํ๋ฅธ ํ์ต ๊ณก์ ์ผ๋ก ๋ฌด์ธ๊ฐ๋ฅผ ๋ฐฐ์ฐ๊ธฐ ์ํด ์๊ฐ์ ํ ์ ํด์ผ ํ๋ค๋ ์๊ฐ์ด ์ ๋ชฝ์ฒ๋ผ ๋๋ฌด ์ง์ณ๋ฒ๋ฆฐ ๋ง์ ๊ฐ๋ฐ์๋ค๊ณผ ํจ๊ป ์ผํ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฝ๋ฉ๋ณด๋ค ๋ ๋ฒ๋ ๋ฐ ํจ์ฌ ๋ ์ ๊ฒฝ์ ์ฐ๋ ์ฌ๋๋ค์ด ๋ง์ต๋๋ค. D ๋๋ ํ๋ฃจ ๋ง์ ๋ฐฐ์ธ ์ ์๋ ๊ฒ์ ์ฐ๋ ๊ธฐ๋ผ๊ณ ์๊ฐํ๋ ๊ณต๊ฒฉ์ ์ธ ์ฃผ๋์ด ๊ฐ๋ฐ์์ ๋๋ค.
๋๋ ๊ฐํ๋ฅธ ํ์ต ๊ณก์ ์ผ๋ก ๋ฌด์ธ๊ฐ๋ฅผ ๋ฐฐ์ฐ๊ธฐ ์ํด ์๊ฐ์ ํ ์ ํด์ผ ํ๋ค๋ ์๊ฐ์ด ์ ๋ชฝ์ฒ๋ผ ๋๋ฌด ์ง์ณ๋ฒ๋ฆฐ ๋ง์ ๊ฐ๋ฐ์๋ค๊ณผ ํจ๊ป ์ผํ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฝ๋ฉ๋ณด๋ค ๋ ๋ฒ๋ ๊ฒ์ ํจ์ฌ ๋ ์ ๊ฒฝ์ ์ฐ๋ ๋ง์ ์ฌ๋๋ค์ด
๊ทธ๊ฒ๋ค์ ๊ฐ๋ฐ์ Angular๊ฐ ๊ทธ ๋น์์ ์์ง๋์ด ๋ฐฐ์ฐ๊ณ ์ถ์ง๋ ์๊ณ ์ถฉ์กฑ์ํค๋ ค๊ณ ํ๋ ๊ฒ์ ๋๊น? :) ๊ทธ๋ฆฌ๊ณ ๋๊ฐ ์ด์จ๋ ์ด ์์ ์์ ๊ด์ฌ์ ๊ฐ์ต๋๋ค. Angular๋ ํ๋์ ์ฌ์ฉ๋์ด ์์ผ๋ฉฐ ์๋ฌด๋ฐ๋ ๊ฐ์ง ์์ผ๋ฉฐ ๊ด์ฐฐ ๊ฐ๋ฅํ ์๋ช ์ฃผ๊ธฐ, ๊ด์ฐฐ ๊ฐ๋ฅํ ์ ๋ ฅ, ๊ด์ฐฐ ๊ฐ๋ฅํ ์ด๋ฒคํธ๋ฅผ ์ถ๊ฐํ๋ฉด ๊ฒฌ์ธ๋ ฅ์ ์ ๋ ์์ง ์์ ๊ฒ์ ๋๋ค. ์ด ์ธ ๊ฐ์ง ์์ ๊ฒ์ ์ถ๊ฐํ๊ธฐ๋ง ํ๋ฉด ์ฌ๋๋ค์ ์ ์ ๋์ ๋ง์กฑํ ๊ฒ์ ๋๋ค. ๊ทธ๊ฒ ๋ค์ ๋๋ค(๊ทธ๋ฆฌ๊ณ ๊ธฐ๋ณธ ํจํค์ง๋ฅผ ์์ฑํ๋ ค๋ฉด https://indepth.dev/component-features-with-angular-ivy/๋ฅผ ๋ฐ๋ผ๊ฐ์ญ์์ค).
์ด๊ฒ์ด ๋ชจ๋ ๊ฒ์ ๋งํด์ค๋๋ค. IMHO Angular๋ ์ผ๊ด์ฑ์ ์ ์งํ๊ณ ๋ ๋ง์ RxJS๋ฅผ ์ฌ์ฉํด์ผ
Angular๊ฐ ๊ทธ ๋ ํด๊ฒฐํ๋ ค๊ณ ํ๋ ๊ฒ์ด ๋ฐ๋ก ๊ฐ๋ฐ์์ ๋๊น? :)
์, rxjs๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๋๋ฅผ ์์ฑํ๋ ค๋ ๊ฐ๋ฐ์์๊ฒ๋ง ์ ๊ณตํ๋ ๊ฒ์ ํ์ธ์ ๋๋ค. rxjs๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ ํธํ์ง๋ง Angular๊ฐ ๋ ๊ฐ๋ฐ์ ๋ชจ๋๋ฅผ ๋ง์กฑ์ํค๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. Angular๊ฐ ๋ค๋ฅธ ์๊ฐ์ ํ๋ ์ฌ๋๋ค์ด ์๋ ์ฐ๋ฆฌ์๊ฒ๋ง ์ ๊ณต๋์ด์ผ ํ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? ํนํ ์ฐ๋ฆฌ๊ฐ ๋ค์๊ฐ ์๋๋ผ ์์์ ์ํ๋ค๊ณ ๋ฏฟ์ ๋.
๋ค์ ๋งํ์ง๋ง, ๊ด์ฐฐ ๊ฐ๋ฅํ ์๋ช ์ฃผ๊ธฐ, ์ ๋ ฅ, ์ด๋ฒคํธ๋ฅผ ์ถ๊ฐํ ๋์ ๊ฐ์ด "์์ ํ ๋ฐ์์ "์ผ๋ก ์งํํ๋ ๊ฒ์ ๋น์ ์ด ๋งํ๋ ๊ฒ์ ์ด๋ค ์์ผ๋ก๋ ์ํฅ์ ๋ฏธ์น์ง ์์ง๋ง ๋ค๋ฅธ ๊ทธ๋ฃน์ ๋งค์ฐ ํ๋ณตํ๊ฒ ๋ง๋ค ๊ฒ์ ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ปดํฌ๋ํธ ๊ธฐ๋ฅ์ ๋ฐ์ํ ํ๋ก๊ทธ๋๋ฐ์ ์ข์ํ๋ ์ข์ํ์ง ์๋ ์ ์ฉํฉ๋๋ค.
@fxck ๋๋ ๊ทธ๊ฒ์ ๋ํด ํ ์๊ฐ๋ ๋์ํ์ง ์์์ต๋๋ค. ๋๋ rxjs๋ฅผ ์ฌ์ฉํ๊ธฐ๋ฅผ ์ํ์ง ์๋ ๋ง์ ์ฌ๋๋ค์ด ์๊ณ ๊ทธ๊ฒ์ ๋ํด ๋ถํํ๊ธฐ ์ํด github ๋ฌธ์ ๋ฅผ ์ด์์ต๋๋ค.
Angular๊ฐ ์ฝ์ด๋ฅผ ๊ฐ๋ฐํ๊ธฐ๋ก ๊ฒฐ์ ํ ๋ฐฉ๋ฒ(๋ฐ์์ ์ด๋ ์๋๋ )์๋ ๋ถ๊ตฌํ๊ณ ์ด์์ ์ธ ์ธ๊ณ์์๋ ๋ฐ๋ ์๊ตฌ๋ฅผ ์ถฉ์กฑํ๊ธฐ ์ํด ์์ ๋น๋๋ ๋ฐ๋ ํจํค์ง๊ฐ ์์ต๋๋ค(์: @angular/reactive
๋๋ @angular/imperative
- ๋ ๋์ ์ด๋ฆ์ผ๋ก). ์ํ๋ฉด).
์ปค๋ฎค๋ํฐ์ ๊ฐ๋ ์ด ๋ ๊ฐ์ง ์ค ํ๋๋ ์ ์๊ฒ ์ด๋ค ์ฌ๋๋ค์๊ฒ๋ ๋ค์ด๊ทธ๋ ์ด๋์ด๋ฉฐ ์ ์๊ฒ๋ ํ๋ฅญํ ๋ฐ์ ํ๋ ์์ํฌ๊ฐ ๋ ๊ฒ์ด๋ผ๋ ๊ฐ๋๊ฐ ์ฒ์๋ถํฐ ํจ๊ป ๊ฐ์ผ ํ๋ ์ด์ ์์ต๋๋ค.
์ฐธ๊ณ ๋ก ์ ๋ ์ต๊ทค๋ฌ ๋ฆฌ์กํฐ๋ธ๋ฅผ ์ ์งํ๊ณ ๋ช ๋ นํ ํ์ฅ์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ์ฌ์ธ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ฝ์ด์ ํ์ฅ ํจํค์ง์ ๋จ์์ฑ์ ์ํด ํ์ ์์๋ฅผ ๋ฐ์ํ์ผ๋ก ์ฐ๊ฒฐํ๋ ๊ฒ๋ณด๋ค ๋ธ๋ฆฌ์งํ๊ธฐ๊ฐ ๋ ์ฝ๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ฉด์ฑ ์กฐํญ: ๊ฐ์ ์ ๊ธฐ๋ฐ์ผ๋ก ๊ณต์ํํ ๋ง์ง๋ง ์์ - ํต์ฌ ๋ช ๋ น์ ์์ฑํ๋ ๊ฒ์ด ํจ์ฌ ๋ ์ฝ๋ค๋ฉด ๋๋ผ์ง ์์ ๊ฒ์ ๋๋ค. - ํ์ฅ ๋ฐ์์ ๋ ๋ณต์กํ ๊ฒ์ ๋๋ค.
@mgechev์ ๋ํ ํธ๊ธฐ์ฌ์ผ๋ก Github ๋ฌธ์ ๊ฐ ์์ต๋๊น? (๋๋ ๋ณธ ์ ์ด ์์ต๋๋ค.) ์๋๋ฉด ์ด๊ฒ์ ๋ Google ์ง์์ ๊ฒ์ ๋๊น?
๋ด๋ถ Google ์ ํ์ด ์๋๋๋ค. ๋น์ ์ (๋ด๊ฐ ํ์ ํฉ๋ฅํ์ ๋์ ๋ง์ฐฌ๊ฐ์ง๋ก) ์ธ๋ถ ์๊ตฌ ์ฌํญ๊ณผ ๋ด๋ถ ์๊ตฌ ์ฌํญ ์ฌ์ด์ ๊ต์ฐจ์ ์ด ์ผ๋ง๋ ํฐ์ง์ ๋๋ ๊ฒ์ ๋๋ค. ์ฃผ์ ์ฐจ์ด์ ์ Google ์ง์์ด Google ์ง์์ด ์๋ ์ฌ๋๊ณผ ์๊ตฌ ์ฌํญ์ด ๊ฑฐ์ ๋์ผํ๋ค๋ ์ ์ ์ ์ธํ๊ณ ๋น๋ ์์คํ ๋ฐ ์ข ์์ฑ ๊ด๋ฆฌ์ ์์ต๋๋ค.
์ฐ๋ฆฌ๋ ์๋ง์ ์ธ๋ถ ํ์ฌ, ๋ด๋ถ ํ, ๊ฐ์ธ ๊ธฐ์ฌ์ ๋ฑ ์์ฒ ๋ช ์ ๊ฐ๋ฐ์์ ์ฐ๋ฝํ๊ณ ์์ต๋๋ค. ๋ ๊ฒฝ์ฐ ๋ชจ๋ RxJS์ ์์ ํ ์ฐธ์ฌํ๊ณ ์ถ์ดํ๋ ์ฌ๋๋ค๊ณผ ๊ทธ๊ฒ์ด ๊ทธ๋ค์๊ฒ ์ฌ๋ฐ๋ฅธ ์ ํ์ด ์๋๋ผ๊ณ ์๊ฐํ๋ ์ฌ๋๋ค์ด ์์ต๋๋ค. ๋ ์ง์ ๋ชจ๋ ํ๋ฅญํ ๋ ผ๊ฑฐ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
์ด๊ฒ์ ์ฐ๋ฆฌ๊ฐ ์๋๋ฅด๊ณ ์ถ์ ๊ฒฐ์ ์ด ์๋๋๋ค. ํนํ ์ ์ ๋ฆฝ๋ ํด๊ฒฐ ๋ฐฉ๋ฒ/์ปค๋ฎค๋ํฐ ์๋ฃจ์ ์ด ์๋ ๊ฒฝ์ฐ ์ปค๋ฎค๋ํฐ์์ ์ํ๋ ์์ ์ ์ถ๊ฐ ๋ฐ์ดํฐ ํฌ์ธํธ๋ฅผ ์์งํ๊ณ ํ์ฌ ๋ณ์ ์ธํธ์ ๋ํ ์ต์ ์ ์๋ฃจ์ ์ ์ค์ ํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
Angular ์ฑ์ ๊ฐ๋ฐํ ๋ ํ๋์ ํตํฉ๋ ์ ๊ทผ ๋ฐฉ์์ ๋ฐ์ํ ๋๋ ํ์(ํ๋ก์ ํธ๋น ์ ํ)๋ก ์ฌ์ฉํ๋ ๊ฒ์ด ๋งค์ฐ ์ ์ฉํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ํผํฉ ๋ฐ ์ผ์น ๊ธฐ๋ฅ์ ๊ฐ๋ฐ ๊ฒฝํ์ ์ง์ํ์ง ์์ผ๋ฉฐ ๋น DRY ์ฝ๋(์: ๋น๋ฐ์์ ์ ๋ ฅ)๋ฅผ ์์ฑํฉ๋๋ค.
๋จ๋ ์ผ๋ก๋ ์๋ฌด ์ผ๋ ์ผ์ด๋์ง ์๊ธฐ ๋๋ฌธ์ ๋ง์ ๊ฐ๋ฐ์๋ฅผ ๋ฆฌ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ์ผ๋ก ์ฌ๊ต์กํ๋ ๋ฐ ์ด๋ ค์์ ๊ฒช๋ ๊ธฐ์ ํ๊ฒฝ์ ์ถฉ๋ถํ ์ดํดํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ๋ช ๋ นํ์ ์ญ์ ํ๋ ๊ฒ์ ๊ธฐ์ ์ ์ต์ ์ ์์น์์ ๊ฐ๋๋ฅผ ๋ฒ์ด๋๊ฒ ๋๋ฉฐ, ๊ฐ๋์ ๊ฐ์ ํ๋ ์์ํฌ์ ๋ํ ๋๊ท๋ชจ ํต์ฌ ์ฌ์ฉ์ ๊ธฐ๋ฐ์ ๊ตฌ์ฑํ๋ฏ๋ก ํ์ค์ ์ด์ง ์๊ฒ ๋ ๊ฒ์ ๋๋ค.
์ฆ, ๋ด๊ฐ ํ์ค์ ์ด์ง ์๋ค๊ณ ์๊ฐํ๋ ๊ฒ์ ๋ช ๋ นํ ์ธํฐํ์ด์ค ์์ ๋ฐ์ํ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌ์ถํ๋ ๊ฒ์ ๋๋ค. ๋ค๋ฅธ ๋ฐฉํฅ์ ๊ด์ฐฐ ๊ฐ๋ฅ ํญ๋ชฉ์ ์ถ๋ ฅ์ ํญ์ ๋ณ์์ ์ธ ์ ์์ผ๋ฏ๋ก ๋งค์ฐ ๊ฐ๋จํฉ๋๋ค. ๋ณ์๋ ๋ช ๋ น์ ์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ฌ์ค ์ด๊ฒ์ด Angular๊ฐ ์ด๋ฏธ ๋ง์ ๊ณณ์์ ํ๊ณ ์๋ ์ผ์ ๋๋ค.
๋ฐ๋ผ์ ๋๋ Angular๋ฅผ ํต์ฌ์์ ์์ ํ ๋ฐ์ํ๋๋ก ๋ง๋ ๋ค์ ๋งจ ์์ ๋ช ๋ นํ "๋ํผ"๋ฅผ ๋ง๋๋ ๋ฐ ํฌํํฉ๋๋ค.
์ด ์ ๊ทผ ๋ฐฉ์์ ์ฃผ์ ๋ฌธ์ ๋ ๋ช ๋ นํ ์ฌ์ฉ์์ ๊ฒฝ์ฐ ๋ ํฐ ๋ง์ด๊ทธ๋ ์ด์ ๋จ๊ณ์ผ ๊ฐ๋ฅ์ฑ์ด ๋งค์ฐ ๋์ต๋๋ค. ์ด๋ Angular ํ์ด ๋ฐฉ์งํ๋ ค๊ณ ํ๋ ๊ฒ๊ณผ ์ ํํ ์ผ์นํ ์ ์๋ ๊ธฐ์ ํ๊ฒฝ์์ ๋ถ๊ฐ๋ฅํ๋ฏ๋ก ํต์ฌ์์ ํด์ผ ํ ์ผ์ ์ ์ํด์ผ ํฉ๋๋ค.
@mgechev ์ด๊ฒ์ ๋ช ๋ฒ์ด๋ ์ ๊ธฐ๋์์ผ๋ฏ๋ก ๋ฐ์์ฑ ์ฝ์ด/๋ช ๋ นํ ํ์ฅ์ ๋ํ ๊ทํ์ ์๊ฐ๊ณผ ์ค ์ ์๋ ๋ค๋ฆฌ๊ฐ ์๋์ง ๋ฃ๋ ๊ฒ์ด ํฅ๋ฏธ๋ก์ธ ๊ฒ์ ๋๋ค.
๋ ๊ฒฝ์ฐ ๋ชจ๋ RxJS์ ์์ ํ ์ฐธ์ฌํ๊ณ ์ถ์ดํ๋ ์ฌ๋๋ค๊ณผ ๊ทธ๊ฒ์ด ๊ทธ๋ค์๊ฒ ์ฌ๋ฐ๋ฅธ ์ ํ์ด ์๋๋ผ๊ณ ์๊ฐํ๋ ์ฌ๋๋ค์ด ์์ต๋๋ค. ๋ ์ง์ ๋ชจ๋ ํ๋ฅญํ ๋ ผ๊ฑฐ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
์ข์ต๋๋ค. RxJS๋ก ๋ณธ๊ฒฉ์ ์ธ ์์ ์ ์ ์ํ์๊ฒ ์ต๋๊น? ๊ด์ฐฐ ๊ฐ๋ฅํ ์๋ช ์ฃผ๊ธฐ, ๊ด์ฐฐ ๊ฐ๋ฅํ ์ ๋ ฅ ๋ฐ ๊ด์ฐฐ ๊ฐ๋ฅํ ์ด๋ฒคํธ๋ฅผ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ ๋ฌด์์ ๋๊น? ๊ทธ๋ฆฌ๊ณ ์๋์, ์ด๋ค ์ค ์ด๋ ๊ฒ๋ ์ค์ ๋ก "์ ํ๋ฆฝ๋ ํด๊ฒฐ ๋ฐฉ๋ฒ/์ปค๋ฎค๋ํฐ ์๋ฃจ์ "์ด ์์ต๋๋ค.
@fxck ์ด๋ค ์ค ์ด๋ ๊ฒ๋ ์ค์ ๋ก "์ ํ๋ฆฝ๋ ํด๊ฒฐ ๋ฐฉ๋ฒ/์ปค๋ฎค๋ํฐ ์๋ฃจ์ "์ด ์์ต๋๋ค.
๏ฟผ์ฌ์ค์ ๋๋ค. ๋๋ ์ด๋ฌํ ์๋ฃจ์ ์ค ํ๋๋ฅผ ์์ฑํ์ผ๋ฉฐ ํ ํ๋ฆฟ์ ์๋ชป๋ ์ ํ ๊ฒ์ฌ์ ์์กดํ๋ ํ๋์ ํฐ ํดํน์ผ๋ก ์ธํด์๋ง ์๋ํฉ๋๋ค. ์ด ์ค๋ ๋์ ๊ฒ์๋ ๋ช ๊ฐ์ง ๋ค๋ฅธ ์๋ฃจ์ ๋ ํ์ธํ์ผ๋ฉฐ ๊ฐ๊ฐ์๋ ๋ค์ ๋ฌธ์ ์ค ํ๋ ์ด์์ด ์์ต๋๋ค.
๋ด๊ฐ ์๊ฐํ๋ ํ, ์ด๊ฒ์ ๋ฉ์ง๊ฒ ํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํฉ๋๋ค.
๊ด์ฐฐ ๊ฐ๋ฅํ ์ด๋ฒคํธ๋ ํจ์ฌ ๋ ๋์ฉ๋๋ค. ์ปค๋ฎค๋ํฐ ์๋ฃจ์ ์ด ๋ง์ง ์์ผ๋ฉฐ ์ผ๋ฐ์ ์ผ๋ก ์ถ๊ฐ ๋น๋ ๋จ๊ณ(์ผ๋ถ ๊ฒฝ์ฐ monorepo ์ค์ ์์ SSR ์ค๋จ)์ ๊ทธ ์์ ํดํน์ด ํ์ํฉ๋๋ค(์๋ฅผ ๋ค์ด ํด๋์ค ํ์ฅ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ). Angular๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ด๋ฅผ ์ง์ํ์ง ์๊ธฐ ๋๋ฌธ์ ์๋ช ์ฃผ๊ธฐ ๊ด์ฐฐ ๊ฐ๋ฅํ ์ด๋ฒคํธ๋ฅผ ๊ฐ์ ธ์ต๋๋ค. https://github.com/typebytes/ngx-template-streams/issues/8
์๋ช ์ฃผ๊ธฐ ์ด๋ฒคํธ๋ ํ๋ฆผ์์ด "๊ฐ์ฅ ์ฌ์ด" ๊ฒ์ด์ง๋ง ์ฌ์ ํ ํด๋์ค ํ์ฅ ๋๋ ์ฌ์ฉ์ ์ง์ ๋ฐ์ฝ๋ ์ดํฐ์ ์์กดํด์ผ ํ๋ฉฐ ์ด๋ ๊ฒ๋ ์ด์์ ์ด์ง ์์ต๋๋ค.
@fxck ๋ด๊ฐ ์๋ ํ ๋ถ๋ชจ ํด๋์ค(eug) ๋๋ ์ฌ์ฉ์๊ฐ ์์ฒด ํ๊ดด ์๋ช ์ฃผ๊ธฐ ์ด๋ฒคํธ(๋ ๋์ ๊ฒฝ์ฐ)์์ ํธ์ถํด์ผ ํ๋ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์๋ช ์ฃผ๊ธฐ ์ด๋ฒคํธ ๊ตฌ๋ ์ ์ ๋ฆฌํ ์ ์์ต๋๋ค.
์๋ช ์ฃผ๊ธฐ ์ด๋ฒคํธ๋ ํ๋ฆผ์์ด "๊ฐ์ฅ ์ฌ์ด" ๊ฒ์ด์ง๋ง ์ฌ์ ํ ํด๋์ค ํ์ฅ ๋๋ ์ฌ์ฉ์ ์ง์ ๋ฐ์ฝ๋ ์ดํฐ์ ์์กดํด์ผ ํ๋ฉฐ ์ด๋ ๊ฒ๋ ์ด์์ ์ด์ง ์์ต๋๋ค.
์ฌ์ฉ์ ์ง์ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์๋ช ์ฃผ๊ธฐ ์ด๋ฒคํธ(๋ฐ์ํ์ผ๋ก ๋ง๋ค๊ธฐ ์ํด)๋ ๊ตฌํํ๋ ค๊ณ ์๋ํ์ง๋ง ๊ณ ํต์ค๋ฝ์ต๋๋ค. ~ํด๋์ค ํ์ฅ ์์ด 100๋ฒ ํดํน ์์ด ๊ฐ๋ฅํ์ง ๋ชจ๋ฅด๊ฒ ๋ค์~. ๊ฐ๋๋ฅผ ํ์ฅํ๋ ์ฌ์ฉ์ ๊ฐ๋ฅ์ฑ์ ์ง๊ธ๊น์ง ๋งค์ฐ ์ด์ ํ๋ฉฐ ์ด๋ฅผ ์ํํ๊ธฐ ์ํด ํดํน์ด๋ ๋ง์ ์์ฉ๊ตฌ์ ์์กดํฉ๋๋ค.
@tonivj5 ๊ตฌ์ฑ ์์ ๊ธฐ๋ฅ ์ด ๊ณต๊ฐ API์ธ ๊ฒฝ์ฐ ์์ ์์ด ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ตฌํํ๋ ์ ์ฌ์ ์ธ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ๋ณด์ญ๋๊น ?
@ntziolis ํํ ๊ธฐ๋ฅ์ ์ธ๊ธํด์ผ ํ๋ ๊ฒ์ด ์ฌ๋ฏธ์์ต๋๋ค. ์ ๋ ์ค์ ๋ก ngx-sub-form์ ์๋ช ์ฃผ๊ธฐ ๋ถ๋ถ์์ ์์ ํ๊ณ ์์ผ๋ฉฐ ๊ธฐ๋ฅ์ ์ ํํ ์ ๊ฐ ๋์์ด ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๋ ๊ฒ์ ๋๋ค. ๊ทธ ๋์ ์์ด๋น๋ก ๊ตฌ์ฑ ์์ ๊ณต์ฅ์ ํจ์นํ๋ ๊ฒ์ ๋งค์ฐ ๊ฐ๋ฅํฉ๋๋ค. ๋๋ ์ด๊ฒ์ด ngx-sub-form ์ธ๋ถ์์ ๋งค์ฐ ์ ์ฉํ๋ค๊ณ ์๊ฐํ๋ฏ๋ก ์ด ๋ ผ๋ฆฌ๋ฅผ ๋ณ๋์ lib๋ก ๋ถํ ํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
@ntziolis ์ด ์์ ์์ Ivy ์ฝ์์ด ์ค์ ๋ก ์ ๋ฌ๋๋ ๊ฒ์ ๋ณผ ์ ์์์ง ํ์ ํ ์ ์์ต๋๋ค.
๊ฐ์ง ํจ๊ณผ๋ฅผ ํ์ธ ํ์ต๋๊น? (ngrx/effects ์๋) https://dev.to/stupidawesome/reactive-adventures-in-angular-introducing-angular-effects-1epf ์ด ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์์ ํ ๋ฐ์ํ๋ ์ ํ๋ฆฌ์ผ์ด์
์ ์์ฑํ ์ ์์ต๋๋ค.
๋ถ๋ชจ ๋ฐ ์์ ๊ตฌ์ฑ ์์ ๊ฐ์ ์๋ฐฉํฅ ๊ด์ฐฐ ๊ฐ๋ฅ ์ํ ํฌํจ
https://dev.to/stupidawesome/exploring-the-angular-effects-api-2gol
๋ฒ์ 9.1.0์ Vue 3์ ๊ตฌ์ฑ API๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ๊ตฌ์ฑ/ํํฌ ๋ชจ๋ธ์ ๋์
ํฉ๋๋ค.
Angular๊ฐ ๋ฐ์์ฑ๊ณผ ํจ๊ป ์๋ํ๋ ๊ฒ์ ์ ๋ง ๋ค์ ๋จ๊ณ๋ผ๊ณ ์๊ฐํฉ๋๋ค.
@mgechev
์ด๊ฒ์ ํนํ ์ ํ๋ฆฝ๋ ํด๊ฒฐ ๋ฐฉ๋ฒ/์ปค๋ฎค๋ํฐ ์๋ฃจ์ ์ด ์๋ค๋ ์ ์ ๊ณ ๋ คํ ๋ ์๋๋ฅด๊ณ ์ถ์ ๊ฒฐ์ ์ด ์๋๋๋ค.
๊ถ๊ธํฉ๋๋ค. ์ฐ๋ฆฌ๋ ๋๊ตฌ์ด๋ฉฐ ์ผ๋ง๋ ๋ง์ Google ์ง์์ด Angular ์์ฌ ๊ฒฐ์ ๊ณผ์ ์ ์ ๊ทน์ ์ผ๋ก ๊ธฐ์ฌํ๊ณ ์์ต๋๊น?
๋น์ ์ ์ด๊ฒ์ด ์๋๋ฅด์ง ๋ง์์ผ ํ ๊ฒฐ์ ์ด ์๋๋ผ๊ณ ๋งํ์ง๋ง, ์๋๋ฅด์ง ์๋๋ค๋ ๋น์ ์ ์ ์๊ฐ ๋ฌด์์ธ์ง ๊ถ๊ธํฉ๋๋ค. ์ด๊ฒ์ 'Fixed by Ivy' ํ๊ทธ๋ฅผ ๋๋ฆฌ๊ณ ๋ ๋ง์ ๊ฐ๋ฐ์๊ฐ ์ํฉ์ ๋ค์ ์๋๋ฝ๊ฒ ๋ง๋ค๊ธฐ ์์ํ ๋๊น์ง ๋ฌด์ํ๋ ๊ฒ ์ค ํ๋์ ๋๊น? ๋ฐ์ ์์ ์ ๋ํด ์ผ๋์ ๋ ๋์ ๋ฒ์ ์ด ์์ต๋๊น? ์๋๋ฉด ๋จผ์ ๋ฆด๋ฆฌ์คํด์ผ ํ๋ ๋ค๋ฅธ ์ต์ ์ปดํ์ผ๋ฌ ๋ฒ์ ์ด ์์ต๋๊น?
์ฃผ์ด์ง ์๊ฐ์ ์ผ๋ฐ์ ์ผ๋ก 2500๊ฐ์ ๋ฏธํด๊ฒฐ ๋ฌธ์ ๊ฐ ์๋ค๋ ์ฌ์ค์ด ๋ด๋ถ ํ ๋ก ์์ ๋์จ ์ ์ด ์์ต๋๊น?
@ntziolis , @zakhenry๊ฐ ๋งํ๋ฏ์ด features
๊ฐ ๋์์ด ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
@ntziolis ๋๋ ์๋ช ์ฃผ๊ธฐ์ ๋ํด ๋ค๋ฅธ ์๋๋ฅผ ํ๊ณ ์๋ํ๋ POC๊ฐ ์์ต๋๋ค (ํด๋์ค ํ์ฅ์ด ์๊ณ ์๋ช ์ฃผ๊ธฐ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ์ง ์์). ํ๋ผ์ด๋น API์ ์์กดํฉ๋๋ค(:exclamation:)
@tonivj5 ํํ ๋น์ ์ ๊ธ์ ์ฝ์ ๊ธฐํ๊ฐ ์์์ง๋ง ์ ์๋ฃจ์ ๋ ๊ฑฐ์ ์ถ์๋ ๋ปํ์ต๋๋ค :) https://github.com/cloudnc/ngx-observable-lifecycle
๋ด๊ฐ ์์ ํ๊ณ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์์ด๋์ด๋ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์ฒด ์๋ช ์ฃผ๊ธฐ ์ธ์ ๊ธฐ๋ฅ์ ๋ง๋ค๊ธฐ ์ํด ์ฐ๊ฒฐํ ์ ์๋ ๊ณตํต ๊ธฐ๋ฐ์ ๊ฐ๋ ๊ฒ์ ๋๋ค. ๋์ผํ ํํฌ์ ์ก์ธ์คํ๋ ค๋ ์ฌ๋ฌ ํจ์๊ฐ ์๋ ๊ฒฝ์ฐ ๊ตฌ์ฑ ์์ def์ ์ฅ์๋ ํ๋์ ํํฌ๋ง ์๋๋ก ์๋ํ ์ ์์ด์ผ ํฉ๋๋ค.
CI์ ๋จ์ ํ ์คํธ๋ฅผ ์ ๋ ฌํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
์ฃผ์ด์ง ์๊ฐ์ ์ผ๋ฐ์ ์ผ๋ก 2500๊ฐ์ ๋ฏธํด๊ฒฐ ๋ฌธ์ ๊ฐ ์๋ค๋ ์ฌ์ค์ด ๋ด๋ถ ํ ๋ก ์์ ๋์จ ์ ์ด ์์ต๋๊น?
Lol, 2019๋ ์ค๋ฐ ์ดํ๋ก 2500๊ฐ์ ๊ณต๊ฐ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค.
$ github_issue_stats history -i2m -n20 -sangular/angular
+-------------------------+--------------------+
| period | issues |
+-------------------------+--------------------+
| This month (2020-05) | 2855 (+137, -112) |
| Last month (2020-03) | 2830 (+495, -550) |
| 2 months ago (2020-01) | 2885 (+601, -575) |
| 3 months ago (2019-11) | 2859 (+437, -352) |
| 4 months ago (2019-09) | 2774 (+411, -305) |
| 5 months ago (2019-07) | 2668 (+441, -369) |
| 6 months ago (2019-05) | 2596 (+488, -349) |
| 7 months ago (2019-03) | 2457 (+425, -373) |
| 8 months ago (2019-01) | 2405 (+428, -330) |
| 9 months ago (2018-11) | 2307 (+425, -391) |
| 10 months ago (2018-09) | 2273 (+515, -466) |
| 11 months ago (2018-07) | 2224 (+641, -541) |
| 12 months ago (2018-05) | 2124 (+690, -624) |
| 13 months ago (2018-03) | 2058 (+605, -444) |
| 14 months ago (2018-01) | 1897 (+773, -679) |
| 15 months ago (2017-11) | 1803 (+815, -979) |
| 16 months ago (2017-09) | 1967 (+671, -431) |
| 17 months ago (2017-07) | 1727 (+664, -518) |
| 18 months ago (2017-05) | 1581 (+854, -548) |
| 19 months ago (2017-03) | 1275 (+987, -796) |
| 20 months ago (2017-01) | 1084 (+671, -505) |
+-------------------------+--------------------+
๋ด ์ทจํฅ์ ๋ฐ๋ผ ํ ๋ก ์์ด ์ด๋ฆฐ ๊ฐ ๋ฌธ์ ๋ฅผ ๋ซ๋ ํ๋ก์ ํธ๋ณด๋ค ๋ช ํํ ์ปค๋ฎค๋ํฐ ํ ๋ก /ํฉ์๊ฐ ์์ ๋๊น์ง ๋ฌธ์ ๋ฅผ ํ ๋ก ์ ๊ณต๊ฐํ๋ ์คํ ์์ค ํ๋ก์ ํธ๋ฅผ ์ ํธํฉ๋๋ค. ๋ํ ์ ์ง ๊ด๋ฆฌ์๊ฐ ์ ์ ์๋ฝ ๊ฐ๋ฅ์ฑ์ ์ฐจ๋จํ๊ธฐ ์ ์ ์ปค๋ฎค๋ํฐ์ ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ์ฐ๋ ค ์ฌํญ์ ์ค๋ช ํ๋ ๋จ๊ณ์ด๊ธฐ๋ ํฉ๋๋ค.
@agalazis ์ด ๋ฌธ์ ๋ 4 1/2๋ ๋์ ๊ณต๊ฐ๋์์ผ๋ฉฐ ์ง๋ 3๋ ๋์ ๊ฑฐ์ ๋ฌด์๋์์ต๋๋ค.
@agalazis ์ด ๋ฌธ์ ๋ 4 1/2๋ ๋์ ๊ณต๊ฐ๋์์ผ๋ฉฐ ์ง๋ 3๋ ๋์ ๊ฑฐ์ ๋ฌด์๋์์ต๋๋ค.
Angular ํ ๊ตฌ์ฑ์์ด ์ ์ด๊ฒ์ด ์์ง 5์ผ ์ ์ ์ด๋ ค ์๋์ง ์ค๋ช ํ๋ฏ๋ก ๋น์ ์ด ์ณ์ง ์์ต๋๋ค.
@etay2000 ์ด๋ค ๊ฒฐ์ ์ ์ ์ฒด ํ๋ก์ ํธ์ ๋ฐ์ ์ ์ํฅ์ ๋ฏธ์น๊ธฐ ๋๋ฌธ์ ๋๋๋ก ์ด๋ ค์ธ ์ ์์ต๋๋ค. ๊ทธ๊ฒ์ ์์ฉ ๊ฐ๋ฅํฉ๋๋ค. ๊ฐ๋ฐ์๋ ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ๊ฐ๊น์ด ์ฅ๋์ ๊ธฐ๋ฅ์ ์์กดํ ์ ์๋ค๋ ๊ฒ์ ๊นจ๋ฌ์ ์ ์์ง๋ง ๊ฐ๋ฅ์ฑ์ด ์๋ค๋ฉด ์ ์กฐ๊ธฐ์ ์ข ๋ฃํฉ๋๊น? ๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ์ ์ ์์ ๊ฑฐ๋ถํ๊ณ ๋ฌธ์ ๋ฅผ ์ข ๋ฃํ๋ ๊ฒ์ด์ง๋ง ์ด์ ๊ฐ ์์ด์ ๋ฐ์ํ์ง ์์๋ค๊ณ ์๊ฐํฉ๋๋ค.
@beeman
Angular ํ ๊ตฌ์ฑ์์ด ์ ์ด๊ฒ์ด ์์ง 5์ผ ์ ์ ์ด๋ ค ์๋์ง ์ค๋ช ํ๋ฏ๋ก ๋น์ ์ด ์ณ์ง ์์ต๋๋ค.
์์ง์๊ฐ๋ฝ์ ์๋๋ก ๋ด๋ฆฌ๋ ์ด๋ชจํฐ์ฝ์ด ์ ๋ง ๋ง์์ ๋์๋์? ๊ทธ๋ฐ๋ฐ ๊ทธ๊ฒ ์ ๋ง ์ค๋ช ์ด ๋์๋์? 4๋ ์ด ์ง๋ ํ ๊ทธ๋ ๊ฒฐ์ ์ ์๋๋ฅด๊ณ ์ถ์ง ์๋ค๊ณ ๋งํ์ต๋๋ค.
@agalazis
์ผ๋ถ ๊ฒฐ์ ์ด ์ด๋ ต๋ค๋ ์ ์๋ ๋์ํ์ง๋ง ์ด๋ ค์ด ๊ฒฐ์ ์ ๋ด๋ฆฌ๋ ๊ฒ์ ์ฐ๊ธฐํ ์ ์๋ ํ์ฉ ๊ฐ๋ฅํ ์๊ฐ ํ๋ ์์ผ๋ก ๊ฐ์ฃผ๋์ด์ผ ํ๋ ๊ฒ์ ๋ฌด์์
๋๊น? 2855๊ฐ์ ๋ชจ๋ ๋ฏธํด๊ฒฐ ๋ฌธ์ ๊ฐ ์ด๋ฌํ ์ด๋ ค์ด ๊ฒฐ์ ์ ํฌํจํ๋ ๊ฒ์ ์๋์ง๋ง ๋ง์ ๋ฌธ์ ๋ ๊ฝค ์ค๋ซ๋์ ์กด์ฌํด ์์ต๋๋ค.
@etay2000 ์๋ฝ ์ฌ๋ถ๋ ์คํ ์์ค์ ๋๋ค. ๋ฌธ์ ๋ฅผ ์ฌ๋ ์ฌ๋๋ค์ ์ ์ง ๊ด๋ฆฌ์๋ณด๋ค ํจ์ฌ ๋ง์ต๋๋ค. ์๋ฅผ ๋ค์ด Typescript ํ๋ก์ ํธ์๋ ๊ฑฐ์ ๋ ๋ฐฐ๋ ๋ง์ ๋ฌธ์ ๊ฐ ์์ผ๋ฉฐ ๋ด๊ฐ ๊ฑฐ๊ธฐ์์ ํ ๋ค๋ฅธ ์ ์๋ ์ค๋ ์๊ฐ์ด ๊ฑธ๋ ธ์ต๋๋ค. ํ ๋ก ์์ ๊ธฐ๋ฅ์ด ์๋ ๊ฒ๋งํผ ํ๋ คํ์ง๋ ์์ง๋ง ๋ค๋ฅธ ๋ง์ ๊ด์ ์ ๋ณผ ์ ์์๋ ๋ง์ ๋์์ด ๋์๊ธฐ ๋๋ฌธ์ ์ ๊ฒฝ ์ฐ์ง ์์ต๋๋ค.
@agalazis ๋ค ๋ง์ด ๋ง์. ๋ด๊ฐ (์๋ชป๋) ์์ ํ๋ก์ ํธ์์๋ณด๋ค Google์์ ์ ์ง ๊ด๋ฆฌํ๋ ์คํ ์์ค ํ๋ก์ ํธ์์ ๋ ๋ง์ ๊ฒ์ ๊ธฐ๋ํ๋ ๊ฒ ๊ฐ๋ค.
@beeman ์์ง์๊ฐ๋ฝ ์๋ ์ด๋ชจํฐ์ฝ์ ์ฌ๊ธฐ์ ์ฝ์ ํ์ญ์์ค: -------->
@etay2000 ์ค์ํ ๊ฒฐ์ ํ๋ํ๋๊ฐ ์์ญ๋ง ๊ฐ์ง, ํ๋ก์ ํธ, ์ฌ๋์๊ฒ ์ํฅ์ ๋ฏธ์น๋ค๋ ์ฌ์ค์ ํญ์ ๊ธฐ์ตํด์ผ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ ์ค์ํ ๊ฒ์ ์๋ฒฝํ์ง ์์ ๊ฒฐ์ ๊ณผ ๊ณต๊ฐ API๋ฅผ ๋์ ํ ํ ์งง์ ์๊ฐ์ ์ผ๋ถ ํ๊ธฐ์ ์ธ ๋ณ๊ฒฝ์ผ๋ก ์ด์ด์ง ์ ๋ชฝ์ ๋๋ค. ๊ฐ PR์์ ๊ฐ ๋จ๊ณ๊ฐ ์ด๋ป๊ฒ ๊ฒํ ๋๋์ง ๊ฑฐ์ ๋ณผ ์ ์์ผ๋ฉฐ, ์๋ฒฝํ์ง ์์ ๊ฒฝ์ฐ ๋ช ์ฃผ, ๋ช ๋ฌ ๋๋ ๋ช ๋ ์ ๊ธฐ๋ค๋ฆฝ๋๋ค.
@agalazis ๋ค ๋ง์ด ๋ง์. ๋ด๊ฐ (์๋ชป๋) ์์ ํ๋ก์ ํธ์์๋ณด๋ค Google์์ ์ ์ง ๊ด๋ฆฌํ๋ ์คํ ์์ค ํ๋ก์ ํธ์์ ๋ ๋ง์ ๊ฒ์ ๊ธฐ๋ํ๋ ๊ฒ ๊ฐ๋ค.
๋ชจ๋ฅด๊ฒ ์ด ๋ฐ๋๋ ๋คํธ๋ ๋ด. Google์ ์ค์ ๋ก 50๋ ๋์ ์์ฒญ๋๊ฒ ์ธ๊ธฐ ์๋ ์ปค๋ฎค๋ํฐ ์์ฒญ์ ๋ฌด์ํ๋ ๊ฒ์ผ๋ก ๊ฝค ์ ๋ช ํฉ๋๋ค. D ์ผ๋ฐ์ ์ผ๋ก ์ธ์ด/ํ๋ ์์ํฌ ๋ฑ์ ๋ํ ์ ๊ทผ ๋ฐฉ์์ ๋๋ค. ๋งค์ฐ ๋ณด์์ ์ ๋๋ค. ์์ญ์ ํ๋ช ์ ์ผ์ผํค๊ณ Google์์ ๋ช ๋ ๋์ ์ด๋ฅผ ์ฑํํ์ง ์๊ณ ์๋ ์๋ก์ด ์ธ์ด์ ์์ด๋์ด๊ฐ ๋ฑ์ฅํ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด Dart๋ณด๋ค ์ค๋ ์ ์ null ์์ ํํธ Kotlin, TypeScript ๋ฐ Scala๊ฐ ์์ต๋๋ค. ์ด๋ฐ ์ข ๋ฅ์ ์ ๊ทผ ๋ฐฉ์์๋ ์ฅ์ ๊ณผ ๋จ์ ์ด ์๋ค๊ณ ์๊ฐํ์ง๋ง ์ ์ด๋ ์ ์๊ฒ๋ Google์์ ๊ฐ๋ฐํ ๊ฒ์ด ์ ์ ์ ์ ๋ง์ง ์๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฅํ ํ ํผํ๋ ๊ฒฝํฅ์ด ์์ต๋๋ค.
(์ฌ๋ฌ๋ถ ์ฃ์กํฉ๋๋ค๋ง ์ ๋ ํด์ผ ํฉ๋๋ค.)
@beeman ์์ง์๊ฐ๋ฝ ์๋ ์ด๋ชจํฐ์ฝ์ ์ฌ๊ธฐ์ ์ฝ์ ํ์ญ์์ค: -------->
@etay2000 ์ด๋ฐ ์ข ๋ฅ์ ๋๊ธ์ด ์ฌ๊ธฐ์ ํ์ ์๋ฐ์ด ์๋๋ผ๋ฉด ์ด๋ป๊ฒ ๋์์ด ๋๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๋๋ ๋ชจ๋๊ฐ ์ด๋ป๊ฒ ์์ง์๊ฐ๋ฝ์ ์น์ผ๋๋์ง ์๊ณ ์๋ค๊ณ ํ์ ํฉ๋๋ค. ๊ทธ๋์ ํ์์ ์์ ์ ๋ฌด์์ ๋๊น?
๋ค์ ๋งํ์ง๋ง, ์๋ฌด๋ Angular๋ฅผ ์ฌ์ฉํ๋๋ก ๊ฐ์๋์ง ์์ต๋๋ค. ์ฌ๋๋ค์ด ๋น์ ์ ๋ ๊ธฐ์๊ฒ ํ๋ ๋ค๋ฅธ ํ๋ ์์ํฌ๋ฅผ ์ฐพ์ผ๋ ค๊ณ ๋ ธ๋ ฅํ ์ ์์ต๋๋ค.
@brunojcm ๋๊ธ ๊ฒฝ์ฐฐ์ด ๋๋ ๊ฒ ๊ฐ์์. ์์ ์ ๊ทธ๊ฐ ๋ด ๋ค๋ฅธ ๋ชจ๋ ์๊ฒฌ์ ๋ฌด์ํ๋ค๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ๋๋ ํ์๊ฐ ํ๋์ ์๋ฐํ๋ ๊ฒ์์ ๊นจ๋ซ์ง ๋ชปํ์ต๋๋ค.
๋ค์ ๋งํ์ง๋ง, ์๋ฌด๋ Angular๋ฅผ ์ฌ์ฉํ๋๋ก ๊ฐ์๋์ง ์์ต๋๋ค. ์ฌ๋๋ค์ด ๋น์ ์ ๋ ๊ธฐ์๊ฒ ํ๋ ๋ค๋ฅธ ํ๋ ์์ํฌ๋ฅผ ์ฐพ์ผ๋ ค๊ณ ๋ ธ๋ ฅํ ์ ์์ต๋๋ค.
๋ด๊ฐ ์ ๋ง๋ก ๊ทธ๊ฒ์ ๋์ํ๊ณ ์ถ์ ๋ฐฉ์์ ๋ถ๋ช ํ ์ฌ๊ธฐ์ ์๋ ํ๋ ๊ฐ๋ น์ ์๋ฐํ๋ ๊ฒ์ ๋๋ค.
๋๋ฌ์ต๋๋ค. ๋ชจ๋๊ฐ ์ ๊ธฐ์ ์ผ๋ก ์์ ๋ ํ๋ก๊ทธ๋จ์ผ๋ก ๋์๊ฐ ์ ์์ต๋๋ค. 4~5๋ ํ์ ์ํฉ์ด ์ด๋ป๊ฒ ๋์๋์ง ๋ค์ ํ์ธํ๊ฒ ์ต๋๋ค.
@tonivj5 @zakhenry ์ด๊ฒ์ด ๊ธธ์ด ๋ ์ ์๋ค๋ ์์์ ๋ค์ผ๋ ๋ฐ๊ฐ ์ต๋๋ค .
@mgchev ๋๋ ์ด๊ฒ์ด ์๋น ํ ๋ก ์ด
Vue 3.0์ ๋ฆฌ์กํฐ๋ธ ๋ชจ๋(ref ๋๋ react)์ ์ง์ ์ ์ฉํด ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
@AnonymousArthur @vue/reactivity
ํจํค์ง์ ๋ํด ์ด์ผ๊ธฐํ๋ ๊ฒฝ์ฐ ์์ฑ์ ๋ฐ์์ฑ์ ์ ๊ณตํ๊ณ ์๋ ์คํธ๋ฆผ(RxJ๊ฐ ๋ฌด์์ธ์ง)๊ณผ ์๋ฌด ๊ด๋ จ์ด ์๊ธฐ ๋๋ฌธ์ ์ฌ๊ธฐ์์ ๋
ผ์ํ๋ ๊ฒ๊ณผ ์์ ํ ๊ด๋ จ์ด ์์ต๋๋ค.
@gund ์, ๋์ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด ๋ํ๋ ๊ฝค ์ค๋ ์๊ฐ(4.5๋ )์ด ๊ฑธ๋ฆฌ๊ณ ์์ง ๋๋์ง ์์๊ธฐ ๋๋ฌธ์ subscribe/unsubscribe ๋๋ ngOnChange Handler๋ฅผ ์์ฑํ๊ณ ์ถ์ง ์์ ์ฌ๋๋ค์ ์ํด ๋งค์ฐ ๋น ๋ฅด๊ฒ ์์ด๋์ด๋ฅผ ํ๋๋ค(๊ทธ๋ ์ง ์์ ์๋ ์์). RxJS๋ ๋ฐ์์ฑ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ฉฐ ์ด ๋ํ(๋ชจ๋ ์ฝ์ง๋ ์์)๋ ์ ๋ ฅ ๊ฐ์ Observable๋ก ๋ํํ์ฌ ๊ด์ฐฐ ๊ฐ๋ฅํ๊ฒ ๋ง๋๋ ๊ตฌ๋ฌธ ์คํ์ผ๋ก ๋งํ๋ ๊ฒ์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์ผ๋ฉฐ ์ด๊ฒ์ด ๋ฉ์ง ์์ด๋์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋๋ ์ด ์์ด๋์ด๊ฐ ์ ๋ง ์ ์ฉํ๊ณ ์ฒ์์ @robwormald ์ ํ๋กํ ํ์ ์ด ๋ฉ์ง๊ฒ ๋ณด์ด์ง๋ง ์ ์ฌ์ ์ธ ์ด์ ๊ณผ ์ํฅ์ด ์ผ๋ง๋ ์์์ผ ํ๋์ง๋ฅผ ๊ณผ์ํ๊ฐํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ช ๊ฐ์ง ๋จ์ ์ ์์ ํ๊ธฐ ์ํด ํด๋น ์๋ฃจ์ ์ ์ฝ๊ฐ์ ์กฐ์ ์ ์ ์ํ๊ฒ ์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ธฐ๋ณธ์ ์ผ๋ก๋ ๋์ผํ ์ ๊ทผ ๋ฐฉ์์ ๋๋ค.
์ ์ ํ ๊ฐ๋ ๋ฐ์ฝ๋ ์ดํฐ @OInput()
๋ฐ ์ ํ EventReceiver<T>
์ฐ์ฅ Observable<T>
๋ํ ์ถ๊ฐํ๋ .value
๊ฒํฐ (๊ฐ์ BehaviorSubject<T>
).
@robwormald ์ ์์์์ ๊ฐ์ด ์์ ๊ตฌ์ฑ ์์ ์ธก์์๋ ์๋ฌด ๊ฒ๋ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค. ๊ฑฐ๊ธฐ์ Observable ๊ฐ์ ์ ๋ฌํ๋ ค๋ฉด ์ฌ์ ํ | async
ํฉ๋๋ค. ๋๋ ๊ด์ฐฐํ ์ ์๋ ์ ํ์ผ๋ก ์ ๋ฌํ ์๋ ์์ต๋๋ค. (ํญ์ ๊ทธ๋ ๋ฏ์ด) ๊ด์ฐฎ์ต๋๋ค.
ํ์ ๊ตฌ์ฑ ์์ ์ธก ์์ ์ ์ํ ๋ด์ฉ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค(ํด๋น ์ ์์์ ์ฝ๊ฐ ๋ฒ์ด๋จ).
@Component({ selector: "child" })
class Child {
// Notice, this parallels the patterns of `@Output()`.
@OInput() foo = new EventReceiver<MyType>();
constructor() {
// The reactive way to listen to input changes in the class.
this.foo.subscribe((v) => {
console.log('foo changed', v);
});
// Or you can bind to `foo | async` in the template.
}
// But this would also support less reactive patterns in parallel,
// both for ease of migration and for cases where developers don't
// want to migrate fully.
ngOnChanges(changes: SimpleChanges) {
if (changes['foo']) {
console.log('foo changed', changes['foo'].currentValue); // Unchanged
console.log('foo changed', this.foo.value); // Previously this would have been just `this.foo`
}
}
}
์ด์ ์ด ์ ๊ทผ ๋ฐฉ์์ ์ด์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Input
๋๋ OInput
์ฌ์ฉํ๋์ง ์ ํ์๊ฐ ์์ผ๋ฏ๋ก ์ด ๋ณ๊ฒฝ์ผ๋ก ์ธํ ๊ต์ฐจ ๊ตฌ์ฑ ์์ ๋ฒ๊ทธ์ ์ํ์ด ์ ๊ฑฐ๋ฉ๋๋ค.EventReceiver
๋ ๋ด๋ถ์ ์ผ๋ก takeUntil(ngOnDestroyEvent)
ํตํด ํ์ดํ๋ฅผ ํฌํจํ ์ ์์ผ๋ฏ๋ก ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ๊ตฌ์ฑ ์์๊ฐ ํ๊ดด๋ ๋ ๊ตฌ๋
์ทจ์๋ฅผ ๊ธฐ์ตํ ํ์๊ฐ ์์ต๋๋ค. ์ด๋ฌํ ๊ด์ฐฐ ๊ฐ๋ฅ ํญ๋ชฉ์ด ์๋์ผ๋ก ์๋ฃ๋๊ธฐ ๋๋ฌธ์
๋๋ค. . (์, ๋ฉ๋ชจ๋ฆฌ ๋์ ๊ฐ์!)@Output()
ํจํด๊ณผ ๋งค์ฐ ์ ์ฌํ๊ฒ ๋ณด์ด๊ณ ๊ธฐ๋ฅํ๋ฏ๋ก ๋ฉ์ง ๋ณ๋ ฌ ์ฒ๋ฆฌ์ ์ด๋ค์ ๋ฉ์ง๊ฒ ์ฐ๊ฒฐํ ์ ์๋ ์ ์ฌ์ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.ReplaySubject<T>(1)
๋ฅผ ์ฌ์ฉํ์ฌ ์๋ฐฉํฅ ๋ฐ์ธ๋ฉ์ ๋ํ ๋์์ ๋ณด๋ค ์ํํ๊ณ ์ผ๊ด๋๊ฒ ์ฐ๊ฒฐํ๋ @InputOutput()
๋ฅผ ์ ์ํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ๋๋ฆ์ ๋์ ๊ณผ ๋
ผ๊ฑฐ๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ฌ๊ธฐ์์ ์ ์ ํ์ง ์์ต๋๋ค .@Output()
๋งํผ ๊ฐ๋จํฉ๋๋ค.Observable
๊ฐ ๋ถ๋ชจ์ ์ํด ์
๋ ฅ๋๋ ๋ณ๊ฒฝ ์ฌํญ์ ๋ํด ๋งค๋๋ฝ๊ฒ switch()
์ด๋ฏ๋ก ๋์ผํ Observable ์ธ์คํด์ค๋ฅผ ๊ณ ์ํ์ง ์๋ ๊ฒ๊ณผ ๊ฐ์ ์ฝํ ๋ฐ์ ํจํด์ ํน๋ณํ ๊ฒฝ์ฐ๊ฐ ํ์ํ์ง ์์ต๋๋ค( switch()
ed) ํ์ ๊ตฌ์ฑ ์์.๋ด๊ฐ ์ ํํ OInput
์ด๋ฆ์ ๋ํ ์ฐธ๊ณ ์ฌํญ: ๋ถ๋ช
ํ ๋
ผ์์ ์ฌ์ง๊ฐ ์์ต๋๋ค. ๊ทธ๋ฌ๋ "Observable Input"์ ์ฝ์์ด๊ณ ์ด๊ฒ์ด ๋ฏธ๋ฌ๋ง๋๋ "Output"์ฒ๋ผ ๋ณด์ด๊ธฐ ๋๋ฌธ์ ๊ฐ์ธ์ ์ผ๋ก ๊ทธ ์ด๋ฆ์ ์ข์ํฉ๋๋ค.
์น์ ํ๋ Angular ํ. 2020๋ ์๋ ๋ฌด์์ด๋ ๊ธฐ๋ํด์ฃผ์ธ์ :-)
๋ํ @jcomputer ์๋ฃจ์
์ ๋ด๊ฐ ์ํ๋ ๊ฒ์
๋๋ค. ๋ค๋ฅธ ๋ฐ์ฝ๋ ์ดํฐ ์ด๋ฆ์ ์ด๋ ฌํ ํฌ์ ์๋์ง๋ง @ViewChild
๊ฐ { read }
๊ฐ๋ ๊ฒ๊ณผ ์ ์ฌํ ๋งค๊ฐ๋ณ์๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด ๊ฐ๋ฅํฉ๋๋ค. ์:
@Input({ observable: true })
@Input({ asObservable: true })
@Input({ asSubject: true })
2020๋ ์ ๊ธฐ๋ํ ์ ์๋ ๊ฒ์ด ๋๋ฌด ๋ง์ต๋๋ค. :D ๋ฌผ๋ก ์ด(๋ฐ ์์ ๋์ด๋ ๋ค๋ฅธ ๋ฌธ์ )๊ฐ ์๋ก์ด ๊ธฐ๋ฅ์ด ์๋ ๋ฒ๊ทธ๋ก ๊ฐ์ฃผ๋์ง ์๋ ํ. :)
https://twitter.com/ThomasBurleson/status/1283902827467886592
@fxck ์ฌ๊ธฐ์์ ์ธ๊ธฐ๊ฐ ์๋ ์๊ฒฌ์ด ์์ ์ ์์ง๋ง ์์งํ ๋งํด์ 2020๋ ์ด Angular ํ์ด ์์, ๋ผ์ฐํฐ ๋ฑ์ ๋ํ ๋ง์ ๋ฒ๊ทธ๋ฅผ ์์ ํ๊ธฐ๋ก ๊ฒฐ์ ํ๋ค๋ฉด ์ ๋ 0 ๊ธฐ๋ฅ ์ ์ ํ ํ๋ฅผ ๋ด์ง ์์ ๊ฒ์ ๋๋ค: ์ด๊นจ๋ฅผ ์ผ์ฑ:.
์ฆ, ์ต๊ทผ ์ฌ๊ฑด๊ณผ ๊ด๋ จ๋ ๋ฌธ์ ์ผ ์ ์์ผ๋ฉฐ ํ์ฌ Angular ํ์์ ๋ณต์กํ ์ผ์ด ์งํ๋๊ณ ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ๋๋ ๊ทธ๋ค์ด ์ง๊ธ๊น์ง Angular๋ฅผ ์ ๊ทน์ ์ผ๋ก ๊ตฌ์ถํด ์จ ์๋ํ ์ฌ๋๋ค์ธ heart: ๋ฅผ ์ ์งํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค
์ฃผ์ ๋์ด์ ์ฃ์กํฉ๋๋ค. ๋ ์ ๊ฐ๋ค
@maxime1992 ๋๋ ๊ด์ฐฎ์๊ฑฐ์ผ.
์ฌ๊ธฐ์ ์ธ๊ธฐ๊ฐ ์๋ ์๊ฒฌ์ด ์์ ์ ์์ง๋ง ์์งํ ๋งํด์ 2020๋ ์ด Angular ํ์ด ์์, ๋ผ์ฐํฐ ๋ฑ์ ๋ํ ๋ง์ ๋ฒ๊ทธ๋ฅผ ํด๊ฒฐํ๊ธฐ๋ก ๊ฒฐ์ ํ๋ค๋ฉด ๋๋ ๊ธฐ๋ฅ ์ด
ํ์ง๋ง ๋๋ฅผ ๋ถ์ํ๊ฒ ๋ง๋๋ ๊ฒ์ ์ฐ๋ฆฌ ์์ด๋ ์ฐ๋ฆฌ์๊ฒ ์ํฅ์ ๋ฏธ์น๋ Angular ํ ๋ด๋ถ์ ์ฅ๊ธฐ์ ์ผ๋ก ๊ฑด๊ฐ์ ํด๋ก์ด HR ํ๋ก์ธ์ค๊ฐ ์๋ค๋ ์ฌ์ค์ ๋๋ค. ํนํ ์ด ์ง์ญ์ ๋ํ ๋๊ท๋ชจ ํฌ์์ ๊ด์ ์์.
๋ด POV์์ ๊ทธ๋ค์ ์ฃผ๋ก BOT๋ฅผ ํตํด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์์ต๋๋ค. ์๋ต ์์ด ๋ ๋๊ณ ๋ด์ ์ํด ๋ซํ๋๋ค.,.. :-/
@montella1507 ์๋์ค, ์ด๊ฒ์ ์ฌ์ค์ด ์๋๋๋ค. ๋ด์ ์ด๋ฏธ ๋ซํ ๋ฌธ์ ๋ง ์ ๊ธ๋๋ค. ๊ทธ๋ฆฌ๊ณ Angular ํ์๋ค์ด ์๋ก์ด ์ด์๊ฐ ๋์์ ๋ ์ค๋ช ํ๊ณ ์ฌํํด์ผ ํ ์ฌํญ์ ์ค๋ช ํ๋ ค๊ณ ํ ๋ ๋ง์ ๊ฒฝ์ฐ์ ๋ง์ ๋ ธ๋ ฅ์ ๊ธฐ์ธ์ด๋ ๊ฒ์ ์ด๋ฏธ ์ฌ์ค์ ๋๋ค. ์๊ฐ์ด ๋ง์ด ๊ฑธ๋ฆฌ๋ ๊ณผ์ ์ด๋ฉฐ ๋ง์ ์ธ๋ด๊ฐ ํ์ํฉ๋๋ค.
Angular ํ์ ๋น๋ํ๊ณ ๊ธฐ๋ฅ๊ณผ ๋ณ๊ฒฝ ์ฌํญ์ ๋นจ๋ฆฌ ์ป์ง ๋ชปํ๋ ๊ฒ์ ๋ํด ๋ถํํ๋ ์ฌ๋๋ค์ ์ํด:
๋๋ ๋น์ ์ ๊ณ ํต์ ์ดํดํฉ๋๋ค. ๋๋ ๋ํ Angular์์ ์ด ๊ธฐ๋ฅ์ ๋ณด๊ณ ์ถ์ต๋๋ค. ๊ฐ์ธ์ ์ผ๋ก ์ข์ํ์ง ์๋ ๋ง์ ๊ฒ๋ค์ ๋ณ๊ฒฝํ๊ณ ์ถ์ต๋๋ค.
๊ทธ๋ฌ๋ Angular๋ ๋ฐ์ง์ด๋ ์ ์ฅ๋๊ฐ์ด ๋ชจ๋ ์๊ณ ๋ฆด๋ฆฌ์ค๋ง๋ค ์๋ง์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ํ๋ ์์ํฌ๊ฐ ์๋ ์๋ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฑด ๊ด์ฐฎ์ต๋๋ค. ๋ณด๋ค ์ํฐํ๋ผ์ด์ฆ๊ธ์ ๋ชฉํ๋ก ํ๊ณ ์์ ์ฑ๊ณผ ์ ๋ขฐ์ฑ์ ์ ๊ณตํ๋ ํ๋ ์์ํฌ๊ฐ ์์ด์ผ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ Angular๋ ์ ์ด๋ ๋ด ๊ฒฝํ์ ๋น์ถ์ด ๋ณผ ๋ ์ ์ํํฉ๋๋ค.
๋๋ Vue๋ฅผ ๋ ์ข์ํ๋ค. ๊ฐ์ธ ํ๋ก์ ํธ์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ด ํ๋ก์ ํธ๋ ๋นจ๋ฆฌ ๊ตฌ์์ผ๋ก ๋๊ปด์ง๊ธฐ ์์ํ๊ณ ์๋ก์ด ๊ตฌ์ฑ ์์ ์คํ์ผ๋ก ์ ๊ทธ๋ ์ด๋ํ๊ณ ์ถ์ ์ถฉ๋์ ๋๋๋๋ค. ๋ํ ์ ๊ทธ๋ ์ด๋๋ฅผ ์ํํ ๋ ํญ์ ์ด์ํ ๋ฐฉ์์ผ๋ก ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋ฉ๋๋ค. ์ํ๊ณ๋ ํธํ์ฑ์ ์ ์งํ๊ธฐ๊ฐ ๋ ์ด๋ ค์ด ๊ฒ ๊ฐ์ต๋๋ค.
๋์กฐ์ ์ผ๋ก Angular๋ ์ฑ์ํ๊ณ ์์ ์ ์ ๋๋ค. ์์ฃผ ๋ณ๊ฒฝ๋์ง๋ ์์ง๋ง ์ข ์์ฑ์ ์ ๋ฐ์ดํธํ์ฌ ์ฝ๋๋ฅผ ๋ฆฌํฉํ ๋งํ๋ ์์ ์ด ์ค์ด๋ค๊ณ ์์ฉ ์ ํ์ ์ ์ฉํ๋ค๋ ์๋ฏธ์ด๊ธฐ๋ ํฉ๋๋ค. ์ง์์ ๋ํ ๋ ์ค๋ซ๋์ ๊ด๋ จ์ฑ์ ์ ์งํ๋ฉฐ, ๋ฐ๋ผ๊ฐ๋ ค๊ณ ํ๋ ๋์ ์ฌ์ธต์ ์ผ๋ก ์ด๋ํ ์ ์์ต๋๋ค.
@manfreed ์ฌ๋๋ค์ ๋ฐ์ง์ด๋ ์ ์ฅ๋๊ฐ์ ์๊ตฌํ๋ ๊ฒ์ด ์๋๋ผ ํ๋ ์์ํฌ ๋์์ธ์ ๊ฐ๊ณผ์ ๋ํ ์์ ์ ์๊ตฌํ๊ณ ์์ต๋๋ค. ํ์ฌ ์ฐ๋ฆฌ๋ ํต์ฌ ๊ธฐ๋ฅ์ ์ํด ๋๋๋ก Observable์ ์ฌ์ฉํด์ผ ํ๊ณ ๋๋ก๋ Observable์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ด์ฐฐ ๊ฐ๋ฅํ ๊ฒ์ ์ซ์ดํ๋ ์ฌ๋๋ค์ ์ข์ ํฉ๋๋ค. ๊ด์ฐฐ ๊ฐ๋ฅํ ๊ฒ์ ์ข์ํ๋ ์ฌ๋๋ค์ ์ข์ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ ์ค ๋ง์ ์ฌ๋๋ค์ด ์ฐ๋ฆฌ๊ฐ ํฌ๊ธฐํ๊ณ ๋ค๋ฅธ ํ๋ ์์ํฌ๋ก ๋์ด๊ฐ ์ํฉ์ ๋๋ฌด ์ค๋งํ์ต๋๋ค. ๋๋ ์ฝ๊ฐ์ ๋ฐฉํฅ์ฑ์ธ Angular๋ฅผ ๊ณ์ ์ฌ์ฉํ๊ณ ์ถ์๊ณ ์ ๋ง ํ๋ฅญํ ํ๋ ์์ํฌ๊ฐ ๋ ์ ์์์ต๋๋ค. ๊ทธ๋ฌ๋ ์๋ชป๋ ๊ด๋ฆฌ, ์ค์ฉ์ฃผ์์ ๋ถ์กฑ, ์ค์์ ๋ํ ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์ ๋ชจ๋ ๊ฐ๊ด์ ์ผ๋ก ์ค๋ง์ค๋ฝ์ต๋๋ค.
@insidewhy ์ธ๋ด์ฌ์
๋ก๋๋งต์์ ์์ ์ธ๊ธํ ํน์ ๋ฌธ์ ์ ๋ํ ์ธ๊ธ์ ์์์ต๋๋ค. ์ ๋ ์ฌํ๊ฒ๋, ์ธ๊ธ, ์ธ์ , ...์ด ๋ ผ์๊ฐ Angular discord์ ์ด์ด์ง๊ธฐ๋ฅผ ์ ๋ง๋ก ๋ฐ๋์ต๋๋ค.
๋๋ ๊ทธ๋ค์๊ฒ ์์ฌ์ ์ฌ์ง๋ฅผ ์ฃผ์๊ณ ๊ทธ ์ค๊ฐ ๋ก๋๋งต ๊ธฐ์ฌ ์ ๋ ผํ์์ ๋ฌผ์์ต๋๋ค. Minko์ ์๋ต:
๊ทธ๋ ๋ช ๋ฌ ์ ์ ์ฌ๊ธฐ์์ ๋งํ ๊ฒ์ ๊ฑฐ์ ๋ฐ๋ณตํ์ต๋๋ค. ์ด๋ฌํ rxjs ๊ด๋ จ ๋ฌธ์ ์ค ์ด๋ ๊ฒ๋ ๊ณง ์์ ๋์ง ์์ ๊ฒ์ด๋ฏ๋ก ๊ทธ๋ ์ต๋๋ค.
๋ด ์์ ์ ์ดํดํ๋ ๊ฒ์ ๋๋ฌ์ง๋ง ๋ง์ง๋ง์ผ๋ก ํ ๋ฒ๋ง ๋ ์๋ํด ๋ณด๊ฒ ์ต๋๋ค. Angular๊ฐ
์ด๋ค ์ค ์ด๋ ๊ฒ๋ ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ ๊นจ๋จ๋ฆฌ๊ณ ํ์ต ๊ณก์ ์ ์ฆ๊ฐ์ํค์ง ์์ผ๋ฉฐ ๋ค๋ฅธ API์ ์ผ์นํ์ง ์์ผ๋ฉฐ ์ฑ๋ฅ์ ๊ฑฐ์ ์ํฅ์ ๋ฏธ์น์ง ์๋๋ค๊ณ ์์ํ ์ ์์ต๋๋ค . ๊ทธ๋์ ์ด์จ๋ ์์ ๋์ธ ๋ค๋ฅธ ์์ ๊ณผ ๋น๊ตํ์ฌ ์ด๋ป๊ฒ ๊ทธ๋ ๊ฒ ๊น๋ค๋กญ๊ณ ๋ ๊ธธ๊ณ ์ ์คํ ๊ณํ์ด ํ์ํ์ง ์ ์ ์์ต๋๋ค. ํ ๋ฒ์ ํ๋์ฉ ์ถ๊ฐํ์ฌ ๊ด์ฌ์ ๊ฐ๊ณ ์์์ ๋ณด์ฌ์ฃผ์ญ์์ค. ์ ๋ฐ.
- ๊ด์ฐฐ ๊ฐ๋ฅํ ์๋ช ์ฃผ๊ธฐ
- ๊ด์ฐฐ ๊ฐ๋ฅํ ์ ๋ ฅ
- ๊ด์ฐฐ ๊ฐ๋ฅํ ํ ํ๋ฆฟ ์ด๋ฒคํธ
@insidewy ์ธ๋ด์ฌ์ ๊ฐ์ง๊ณ
์ฌ๋๋ค์๊ฒ 5๋ ์ด์์ ์ธ๋ด๋ฅผ ์๊ตฌํ๋ ๊ฒ์ ๋ง์ ๊ฒฝ์์๋ค์ด ๊ด์ฌ์ ๋ฐ๊ธฐ ์ํด ๊ฒฝ์ํ๋ ๊ฒฝ์ฃผ์์ ๊ณผ๊ฑฐ๋ฅผ ๋ฌ๋ฆฌ๊ณ ์์ ๋ ๊ทธ๋ค์ง ์ค์ฉ์ ์ด์ง ์์ต๋๋ค.
@ insidewhy ๋ ์ผ๋ฐ์ ์ผ๋ก ์๋ฏธํ์ต๋๋ค.
@fxck Google์ 4000๊ฐ์ ์ฑ์ด (๋ด ๋ง์ง๋ง ๊ณ์ฐ์ ์ํด) ๊ฐ์ง๊ณ ๋ณธ์ง์ ์ผ๋ก ๋งค์ฐ ์ ์ฌํ๋ฉฐ ์ด๋ฌํ ํ๋ก์ ํธ์ ๋๋ฃ ๊ฒํ ์ฌ์ด๋ฅผ ์ ํํ๋ ๊ฒ์ด (๋ด ์๊ฐ์) ๋งค์ฐ ๋งค๋๋ฝ์ต๋๋ค. ์ฐ๋ฆฌ ํ์ฌ์์๋ Angular์ ํฐ ์ด์ ์ค ํ๋๋ ๋ด๊ฐ ๋ค๋ฅธ ํ์ ์ฝ๋๋ฅผ ๊ฒํ ํ์ง ์๊ณ ๋ ๋๋ฃ ๊ฒํ ๊ฐ ์ ์ฒด ์กฐ์ฌ๋ฅผ ์์ํ์ง ์๋ ์ํ์ ์๋ค๋ ๊ฒ์ ์ ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
์ด์ ์ด๋ฌํ ์ ์ฉํ RxJS ๋ฐ๋ก ๊ฐ๊ธฐ๋ฅผ ์ฝ์ด์ ๊ตฌํํ๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. ๊ทธ๋ฌ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์? ํน์ ๊ฒฝ์ฐ์ ์ด๋ค ํธํฅ์ด ์ฌ๋ฐ๋ฅธ์ง์ ๋ํ ๋ช ํํ ์ง์นจ ์์ด ์ ์ฐจ์ ํธํฅ ๋ ๋ฐ์์ ํธํฅ์ผ๋ก ๋๋ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค. ์ง๊ธ๊น์ง์ ํ ๋ก ์ ์ฝ์ ํ Angular ํ์ ๋๋ต์ "์ด๊ฒ์ ๋ฎ์ ์ฐ์ ์์์ ๋๋ค"(๊ทํ์ ํ๋ฆ์์ ์ ์ ์๋ฏ์ด)๊ฐ ์๋๋ผ ์ค์ ๋ก "์ฐ๋ฆฌ๋ ํธ์ ๋ค๊ณ ์ถ์ง ์์ต๋๋ค"์ ๋ ๊ฐ๊น์ด ๊ฒ ๊ฐ์ต๋๋ค.
์ฌ๊ธฐ Angular ์ปค๋ฎค๋ํฐ์ ๊ณ ๊ธ RxJS ์ฌ์ฉ์๋ ์์์ ๋๋ค. Typescript, DI, ํ ํ๋ฆฟ ๋ฐ Angular์ ๋ค์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ณ ๋๋ฉด ๋งค์ผ ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ๋ ๋ฐ ๊ฑฐ์ 1๋ ์ด ๊ฑธ๋ฆฌ๊ณ ์ด์ ์ค๋น๊ฐ ์๋ฃ๋๊ธฐ ๋๋ฌธ์ ๋๋ค. RxJS๋ฅผ ์์ ํ ์ดํดํ๋ ค๋ฉด ๋๋ฃ ๋ฆฌ๋ทฐ์์ ๊ณ ์๊ธ ์ฌ๋๋ค์ด ๋ฐ์์ฑ ํธํฅ์ผ๋ก ๋ ๋๊ฒ ํ๋ ๊ฒ์ ์ฌ๋๋ค์ ํจ์ฌ ๋ ์์ธ์ํค๋ฉฐ, ๋ง ๊ทธ๋๋ก Angular๊ฐ ํ์๋ก ํ๋ ๋ง์ง๋ง ๊ฒ์ ๋๋ค.
Angular์ ๋ชฉํ(๋ด๊ฐ ๋ณด๊ธฐ์)๋ "X tech๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ์ข๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํ์ธ์."์ ๊ด๋ จ๋ ๋ํ๋ฅผ ์ค์ด๊ณ ์กฐ์ ํ๊ณ , ๊ตฌํ ์ค์ธ ๋น์ฆ๋์ค ๋ก์ง์ ๋ํ ๋๋ฃ ๋ฆฌ๋ทฐ์์ ๋ํ๋ฅผ ์ ์งํ๋ ๊ฒ์ ๋๋ค. ์ฐ๋ฆฌ๊ฐ ์ด๋ฏธ ๊ฐ์ง๊ณ ์๋ ๊ฒ๋ณด๋ค ๋ "๊ณ ๊ธ" ๊ฐ๋์ "์ด๋ณด์" ๊ฐ๋ ์ฌ์ด์์ ๊ตฌ์ฑ ์์๋ฅผ ๊ณ์ธตํํ๊ณ ์ถ์ต๋๊น?
์ด๊ฒ์ ํ๋ฆผ์์ด ์ฐ๋ฆฌ๊ฐ ์ํ ๊ด๋ฆฌ์์ ๋ณธ ๊ฒ๊ณผ ๋์ผํ ์ฃผ์ฅ์ ๋๋ค. ์ Angular๊ฐ ๋ง์ ๊ฐ๋ฅํ ํจํด ์ค์์ ์ด๋ ๊ฒ์ด ์ฌ๋ฐ๋ฅธ์ง ๊ฒฐ์ ํด์ผ ํฉ๋๊น?
Angular ํ ๊ตฌ์ฑ์ ์ค ํ ๋ช ์ ์ธ์ฉํ๊ฒ ์ต๋๋ค.
๊ทธ๊ฑด ๊ทธ๋ ๊ณ , ์ด๊ฒ๋ค(๊ด์ฐฐ ๊ฐ๋ฅํ ์๋ช ์ฃผ๊ธฐ, ๊ด์ฐฐ ๊ฐ๋ฅํ ์ ๋ ฅ, ๊ด์ฐฐ ๊ฐ๋ฅํ ํ ํ๋ฆฟ ์ด๋ฒคํธ)์ ๋ํด ์ ํ ๋ฐ์ ๋ ๊ฒ์ด ์์ต๋๋ค.
์ด๊ฒ์ ํ๋ฆผ์์ด ์ฐ๋ฆฌ๊ฐ ์ํ ๊ด๋ฆฌ์์ ๋ณธ ๊ฒ๊ณผ ๋์ผํ ์ฃผ์ฅ์ ๋๋ค. ์ Angular๊ฐ ๋ง์ ๊ฐ๋ฅํ ํจํด ์ค์์ ์ด๋ ๊ฒ์ด ์ฌ๋ฐ๋ฅธ์ง ๊ฒฐ์ ํด์ผ ํฉ๋๊น?
์ํ ๊ด๋ฆฌ์ ์ด๊ฒ์ ์ฐจ์ด์ ์ ์ํ ๊ด๋ฆฌ๋ ์ปค๋ฎค๋ํฐ์์ ์ํํ ์ ์์ผ๋ฉฐ ์ด๋ฅผ ๋ฐฉ์งํ๋ ์ต๊ทค๋ฌ ์ฝ์ด ๋ด๋ถ์๋ ์๋ฌด๊ฒ๋ ์๋ค๋ ๊ฒ์ ๋๋ค. ๋ถํํ๋ Angular๋ ๋ด๊ฐ ์ธ๊ธํ ์ธ ๊ฐ์ง ๋ชจ๋๋ฅผ ์ ์ ํ๊ฒ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ง ์์ต๋๋ค. (์์ : ๋๊ธ ๋งํฌ ์์ )
์ ๋ ์์, ๋ผ์ฐํฐ, ํ๋ ์ค ๋ ์ด์์, ์ ๋๋ฒ์ค ๋ฑ๊ณผ ๊ฐ์ ํจํค์ง๋ฅผ ํฌํจํ์ฌ Angular ํ์ด ์ฝ์ด, cli ๋ฐ ๊ตฌ์ฑ ์์์ ์ง์คํ ์ ์๋๋ก ์ต๋ํ ๋ง์ ์ปค๋ฎค๋ํฐ๋ฅผ ์ปค๋ฎค๋ํฐ์ ๋จ๊ธฐ๊ณ ์ถ์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ฅผ ์ํด์๋ ์๋ฅผ ๋ค์ด ๊ณ ์ฐจ ๊ตฌ์ฑ ์์ ๋ฅผ ํ์ฉํ๋ ๊ฒ๊ณผ ๊ฐ์ด ์ปค๋ฎค๋ํฐ์ ์ถฉ๋ถํ ์ง์ ์ ์ ์ ๊ณตํด์ผ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๋ค์ ๋ช ๋ ๋์ ๊ทธ๋ ๊ฒ ํ์ง ๋ชปํ๊ณ (์ข ์ข ์์ด๋น๊ฐ ๋จผ์ ํ์ํ๋ค๊ณ ๋งํจ) ํ์ฌ ๊ณํ์์ ์ด์ ๋ํด ์ธ์ /ํ ๋ก ํ๊ธฐ๋ฅผ ๊ฑฐ๋ถํฉ๋๋ค.
์ง๊ธ๊น์ง์ ํ ๋ก ์ ์ฝ์ ํ Angular ํ์ ๋๋ต์ "์ด๊ฒ์ ๋ฎ์ ์ฐ์ ์์์ ๋๋ค"(๊ทํ์ ํ๋ฆ์์ ์ ์ ์๋ฏ์ด)๊ฐ ์๋๋ผ ์ค์ ๋ก "์ฐ๋ฆฌ๋ ํธ์ ๋ค๊ณ ์ถ์ง ์์ต๋๋ค"์ ๋ ๊ฐ๊น์ด ๊ฒ ๊ฐ์ต๋๋ค.
๋ค, ๊ทธ๋ฆฌ๊ณ ๋ฌด์ญ์ต๋๋ค.
@fxck ๋๋ ์ฐ๋ฆฌ๊ฐ ์ด๊ฒ์ ๋ํด ๊ฐ์ ํ์ด์ง์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ํฌ๋ผ์ด๋ ๋๋ฃ ์์ง๋์ด๋ค๊ณผ ํจ๊ป RxJS๋ฅผ ์ธ๊ธํ ๋๋ง๋ค ์ธ์ฉํ ์ ์๋ ๋๋ถ๋ถ์ ์ธ์ฉ๋ฌธ์ "์์ง๋ ์ด๊ฒ์ ์ดํดํ์ง ๋ชปํ๋๋ฐ ์ด๋ป๊ฒ ๋ ๋ฐฐ์ฐ๋์?"๋ผ๊ณ ๋งํ๊ณ ์ถ์ต๋๋ค. ๋๋ "์ด์์๊ฐ ์ผ๋ง๋ ๋ง์์ง ์๋๋ฉ๋๋ค." ๋๋ "์ด PR์์ ์ด ํ์ดํ๋ผ์ธ์ ์ฝ๋ ๋ฐ ๋ฌธ์ ๊ฐ ์์ต๋๋ค." ์๋ จ๋ RxJS ์์ง๋์ด 1๋ช ๋น 15๋ช ์ ์๋ จ๋ Angular ์์ง๋์ด๊ฐ ๋์น์ ์ฐํธ๋ฆฌ๊ณ ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋ค, ๊ทธ๋ฆฌ๊ณ ๋ฌด์ญ์ต๋๋ค.
์ด๊ฒ์ ์ฐ๋ฆฌ๊ฐ, ์กฐ๊ธ ๊ณผ์ฅํ์ง "ํ์" @angular/core
์ด๋ฌํ ํจํด์ ๊ฐ์ง๊ณ , ์ฌ์ค ์ด๋ค ํ๋ก์ ํธ์ ์ค๋ ์ฌ์ฉํ ์์๋์ด ๋ฌธ์ ์์ ๋ง์ ๋ง์ ๋ณ์ข
๊ณผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์ต๋๋ค. ์์ ์ธ๊ธํ ์ต์
์ ์ฌ์ฉํ๋ ๋ฐ ์์ด ์ ์ผํ ์ฃผ์ ๋ ๋ฏธ๋์ Angular๊ฐ ํ์ค @angular/core
๋์ฒดํ์ผ๋ก ์ ๊ณตํ๋ ๊ฒ์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์
ํด์ผ ํ ์๋ ์๋ค๋ ๊ฒ์
๋๋ค. ์ฐ๋ฆฌ๊ฐ npm uninstall
ํ๊ณ ๋ชจ๋ typescript ์ค๋ฅ๋ฅผ ์์ ํ๋ ๊ฒ์ด ์ ๋ง๋ก ๊ทธ๋ ๊ฒ ์ด๋ ค์ด๊ฐ์?
๋ชจ๋ ๊ฐ๋ ํ๋ก์ ํธ์ ์ํฅ์ ๋ฏธ์น๊ณ ์๋ํ์ง ์๋ ๊ฒฝ์ฐ ๋ฌธ์ํํ๊ณ ๋ง์ด๊ทธ๋ ์ด์ ํ๋ ๋ฐ ์๋ง์ ์๊ฐ์ด ํ์ํ ์ฃผ์ ์ํคํ ์ฒ ๊ฒฐ์ ์ ์ ์๊ฒ ํจ์ฌ ๋ ๋ฌด์ญ๊ฒ ๋ณด์ ๋๋ค.
์ด๊ฒ์ ์ฝ๊ฐ์ ์๊ณก์ ์ ๋๋ค. ์ด๋ฌํ ํจํด์ ๊ฐ๊ธฐ ์ํด @angular/core๊ฐ "ํ์"ํ์ง ์์ต๋๋ค. ์ฌ์ค ์ด ๋ฌธ์ ์๋ ์ค๋๋ ๋ชจ๋ ํ๋ก์ ํธ์์ ์ฌ์ฉํ ์ ์๋ ๋ง์ ๋ณํ๊ณผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์ต๋๋ค.
์๋์, ๊ทธ๋ ์ง ์์ต๋๋ค. ๊ฐ ์๋ฃจ์ ์๋ ํดํน์ด ํ์ํ๊ฑฐ๋ ๋ณ๊ฒฝ๋ ์ ์๋ ๋ด๋ถ API์ ์์กดํฉ๋๋ค. ๊ทธ๊ฒ์ด ์์ ์ ๋๋ค. @insidewhy ๊ฐ https://github.com/angular/angular/issues/5689#issuecomment -630661006์ด๋ผ๊ณ ๋งํ ๊ฒ๊ณผ ํ ํ๋ฆฟ ์ด๋ฒคํธ ์คํธ๋ฆผ์ ๋ํด ๊ทธ ์๋์์ ๋งํ ๊ฒ์ ์ฝ์ผ์ญ์์ค.
// ๋๊ธ ์์ ๋งํฌ ์์
์๋์, ๊ทธ๋ ์ง ์์ต๋๋ค. ๊ฐ ์๋ฃจ์ ์๋ ํดํน์ด ํ์ํ๊ฑฐ๋ ๋ณ๊ฒฝ๋ ์ ์๋ ๋ด๋ถ API์ ์์กดํฉ๋๋ค.
์ปค๋ฎค๋ํฐ์์ ์ด๋ฅผ ์ฒ๋ฆฌํ ์ ์๋๋ก ํ๋ ค๋ฉด ์ด๋ค ๋ด๋ถ API ๋๋ ์ ํ์ ๊ณต๊ฐ/์ผ๋ฐํํด์ผ ํ๋ค๊ณ ์๊ฐํ์ญ๋๊น? ๋ง์ฝ ์ด ๋์์ธ์ด ์์ผ๋ก ๋์๊ฐ ๋ฐฉํฅ์ด ๋ช ํํ์ง ์์์ ํ๋ฉ ํจํด์ด๋ผ๋ฉด, ๊ณ์ํด์ ๊ฐ์ ๋๋ผ์ ๋๋๋ฆฌ๋ ๊ฒ๋ณด๋ค ์ฐ๋ฆฌ ์์ ์ ๋์์ธ์ ํ์ฉํ๋๋ก ์์ฒญํ๋ ๊ฒ์ด ์ ์ ํด ๋ณด์ ๋๋ค.
@insidewhy ๊ฐ ์ฝ์ด ๋ด๋ถ์์ ์ํํ๋ ค๊ณ ์๋ํ ๋ค๋ฅธ ๋๊ธ์ ์ฝ์ด
@fxck ์ ๋ ์ด๊ฒ์ ํต์ฌ์ผ๋ก ๊ตฌํํ๋ ค๋ ์๋์ ์ญ์ฌ๋ ์ด ๋ฌธ์ ๊ฐ 5๋ ๋์ ์ด๋ป๊ฒ ๊ณต๊ฐ๋์๋์ง์ ๋ํด ๋ ผ์ํ์ง ์์ ๊ฒ์ ๋๋ค. ์ปค๋ฎค๋ํฐ๊ฐ ์ค์ค๋ก ๋์์ธ์ ๊ฐ๋ฐํ ์ ์๋๋ก ๋ด๋ถ๋ฅผ ๊ณต๊ฐํ์ง ๋ชปํ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
Yo @insidewhy , ์ด๊ฒ์ด ๋น์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์กดํ๋ ์ ํ ๊ฒ์ฌ ํดํน์ธ์ง ๊ถ๊ธํฉ๋๋ค. ๋ถ๋ช ํ TS 4.0์ ์ฌ์ฉํ์ฌ ๋ ์ด์ ์๋ํ์ง ์์ต๋๋ค.
์ด๊ธฐํ ์ ์ 'serviceStackId$' ์์ฑ์ด ์ฌ์ฉ๋์์ต๋๋ค.ts(2729)
Yo @insidewhy , ์ด๊ฒ์ด ๋น์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์กดํ๋ ์ ํ ๊ฒ์ฌ ํดํน์ธ์ง ๊ถ๊ธํฉ๋๋ค. ๋ถ๋ช ํ TS 4.0์ ์ฌ์ฉํ์ฌ ๋ ์ด์ ์๋ํ์ง ์์ต๋๋ค.
์๋์, ํ ํ๋ฆฟ ์ปดํ์ผ๋ฌ์ ์์์ต๋๋ค. ์ด๊ฒ์ ๋ค๋ฅธ ๊ฒ์ ๋๋ค. ์ ๊ธธ. ์ ๊ธ์. ๋น์ ์ด ๊ทธ๊ฒ์ ๊ณ ์น๊ณ ์ถ๋ค๋ฉด ๋ด๊ฐ ๋น์ ์ ๊ด๋ฆฌ์ ๋ชฉ๋ก์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
@fxck ์ค์ ๋ก ๋ฐ์ฝ๋ ์ดํฐ ๊ธฐ๋ฐ ์์ฑ์ ์์ฑ์๊ฐ ์คํ๋ ๋๊น์ง ์ฃผ์ ๋์ง ์์ผ๋ฏ๋ก ngOnInit์์ ํ์ดํ๋ ์ฐ์ฐ์๋ฅผ ํ ๋นํด์ผ ํฉ๋๋ค. ๋ฐ๋ผ์ ์ด๊ฒ์ ์ค์ ๋ก ์ฝ๋์ ํฉ๋ฒ์ ์ธ ๋ฌธ์ ์ ๋๋ค.
@insidewhy ๋๋ ํ์คํ TS4 ์ด์ ์ ์ผ์ ํ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ ํ์ธ
function ObservableInput() {
return (target: any, propertyKey: any) => {
Object.defineProperty(target, propertyKey, {
set(value: any) {
console.log(target, propertyKey, value);
},
get() {
return 'ObservableInput modified value';
},
})
}
}
class Foo {
@ObservableInput()
bar = 'original bar value';
baz = this.bar;
constructor() {
console.log('loggging this.baz', this.baz);
}
}
new Foo();
๊ทธ๊ฒ์ ๊ธฐ๋ก
this.baz ObservableInput ์์ ๊ฐ ๋ก๊น
๊ทธ๋์ ๋๋ ๊ทธ๊ฒ์ด ์ฌ์ ํ ์๋ํด์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค. TS4์์๋ง ์ปดํ์ผ๋ฌ๊ฐ ํด๋น ๋ฐ์ฝ๋ ์ดํฐ ๋ด๋ถ์ ๊ฐ์ ๊ฐ์ง get
๊ฐ ์๋ค๋ ๊ฒ์ ๊นจ๋ซ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ๋ถํํฉ๋๋ค.
์ ๋ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ Input prop ๋ณ๊ฒฝ์ ๊ฐ์งํ๊ณ Input prop์ ๊ด์ฐฐ ๊ฐ๋ฅํ ๋ฒ์ ์ ๋ง๋ค๊ณ ์์ต๋๋ค. ์ด ์ฝ๋์๋๋ฐ์ค ๋ฐ๋ชจ๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
์๋ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
// subjectize.ts
export function Subjectize(keyToWatch: string): PropertyDecorator {
return (proto: any, propKey: string) => {
const internalKey = Symbol(keyToWatch);
Object.defineProperties(proto, {
[keyToWatch]: {
get() {
return this[internalKey];
},
set(value) {
this[internalKey] = value;
this[propKey].next(value);
}
}
});
};
}
// counter.component.ts
import { Component, Input } from "@angular/core";
import { ReplaySubject } from "rxjs";
import { Subjectize } from "./subjectize";
@Component({
selector: "app-counter",
templateUrl: "./counter.component.html",
styleUrls: []
})
export class CounterComponent {
@Input()
count: number;
@Subjectize("count")
count$ = new ReplaySubject(1);
}
@wmaurer๊ฐ ์ง์ ํ๋ฏ์ด @Subjectize
๋ ์์
์ ์๋ฃํ๊ธฐ ์ํด "์คํ"์ผ๋ก ์ทจ๊ธ๋ ์ ์์ต๋๋ค.
getter/setter
์ฌ์ฉํ์ฌ ์
๋ ฅ ๋ณ๊ฒฝ ์ฌํญ์ ๊ฐ์งํ ์ ์๋ค๊ณ ์ค๋ช
ํ๋ Angular์ ๊ณต์ ๊ฐ์ด๋
@hankchiutw ๊ทธ ์๋ฃจ์
์ ๋ด @BindObservable
๋ฐ์ฝ๋ ์ดํฐ์ ์ ์ฌํฉ๋๋ค. https://github.com/PSanetra/bind-observable#usage
@hankchiutw ๊ฐ์ฌํฉ๋๋ค
ReplaySubject๋ฅผ 1๋ก ์ด๊ธฐํํ๊ธฐ ๋๋ฌธ์ ๋์ BehaviorSubject๋ฅผ ์ฌ์ฉํ๊ธฐ๋ก ์ ํํ์ต๋๋ค.
๋ํ Subjectize์์ ์ง์ ๊ฐ์ ์ด๊ธฐํํ์ต๋๋ค.
export function Subjectize<T>(keyToWatch: string): PropertyDecorator {
return (target: Object, propKey: string) => {
const internalKey = Symbol(keyToWatch);
Object.defineProperties(target, {
[keyToWatch]: {
get(): T {
return this[internalKey];
},
set(value: T) {
this[internalKey] = value;
if (this[propKey]) {
this[propKey].next(value);
} else {
this[propKey] = new BehaviorSubject(value);
}
}
}
});
};
}
@Component({
changeDetection: ChangeDetectionStrategy.OnPush,
selector: 'rol-bla',
templateUrl: 'bla.html',
styleUrls: [ 'bla.scss' ]
})
export class BlaComponent implements OnInit {
@Input() world: World;
@Subjectize<World>('world') world$: BehaviorSubject<World>;
// ...
}
๊ด๋ จ ์์ฑ์์ ์ถ์ธกํ ์ ์์ด์ผ ํ๊ธฐ ๋๋ฌธ์ "Subjectized" ์์ฑ์ ๋ํ ์ ํ ์์ฑ์ ํผํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
๊ฟ์ ๊ทธ๋ ๊ฒ ํ ์ ์๊ณ ๊ด๋ จ Subject ์ํ(๋ด ๊ฒฝ์ฐ์๋ world$)์ BehaviorSubject๋ก ์๋ ์์ฑํ๋ ๊ฒ์
๋๋ค.
export class BlaComponent implements OnInit {
@Input() @Subjectize() world: World;
// ...
}
@mparpaillon ์ ์ํ ๋์์ธ์ https://github.com/PSanetra/bind-observable ์์ ์ํ๋๋ ๋ฐฉ์๊ณผ ๊ฑฐ์ ๊ฐ์ต๋๋ค.
์ ์ผํ ์ฐจ์ด์ ์ @BindObservable()
๋ฐ์ฝ๋ ์ดํฐ๊ฐ ํ๋ ์๋์์ ReplaySubject๋ฅผ ์ฌ์ฉํ๋ค๋ ๊ฒ์
๋๋ค. ๋ฐ๋ผ์ ํด๋น ์ฃผ์ ์ ์ด๊ธฐ ๊ฐ์ด ํฌํจ๋๋๋ก ํ๋ ค๋ฉด ๋ฐ์ธ๋ฉ๋ ์์ฑ๋ ๋ช
์์ ์ผ๋ก ์ด๊ธฐํํด์ผ ํฉ๋๋ค(์์ฑ ์ ํ์ด ์ ์๋์ง ์์ ๊ฐ์ด๋ null ๊ฐ์ ํ์ฉํ์ง ์์ ์ ์์ผ๋ฏ๋ก ์ ์๋์ง ์์ ๊ฒฝ์ฐ์๋).
@Component({
selector: 'app-my-component',
templateUrl: './my-component.component.html',
changeDetection: ChangeDetectionStrategy.OnPush
})
export class MyComponentComponent {
@Input()
@BindObservable()
counter: number;
counter$: ReplaySubject<number>;
}
@PSanetra ์๊ฒ ๊ฐ์ฌํ์ง๋ง ๋ด ์๋ฃจ์ (์ค์ ๋ก๋ Hank ์๋ฃจ์ )์ ์ ํธํฉ๋๋ค.
@mparpaillon ๋๋ ๋ค๋ฅธ ๋ฐ๋ชจ ์์ ๋น์ ์ ๊ฟ(ํ)์ ์ํด ๋ญ๊ฐ๋ฅผ ์๋ํ์ต๋๋ค.
์ฌ์ฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
export class CounterComponent {
@Input()
@Subjectize()
count: number;
@Input()
@Subjectize("myCount$")
anotherCount: number;
}
์ฌ๊ธฐ์ ์ฃผ์ ๊ฐ ์ง์ ๋ ์ํ ์ด๋ฆ์ ์ง์ ํ๋๋ก ์ ํํ ์ ์์ต๋๋ค.
๊ธฐ์ ์ ์ผ๋ก ๊ฐ๋ฅํ์ง๋ง ๊ฐ๋ฐ์์๊ฒ๋ ๋ชจํธํ ์ ์์ต๋๋ค(์ ํด๋์ค ๋ฉค๋ฒ๊ฐ ๋ด๋ถ์์ ์์ฑ๋๊ธฐ ๋๋ฌธ์).
@hankchiutw ๊ฐ์ฌ
๋ํ ๋ชจํธ์ฑ์ ๋ํด ์ณ์ ์๋ ์์ต๋๋ค ... ๋ค์ ๊ฐ์ฌํฉ๋๋ค
Typescript์์๋ count$ ๋๋ myCount$๋ฅผ ์ฌ์ฉํ ์ ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
ํด๋์ค ๋ฉค๋ฒ๋ฅผ "count" ๋ฐ "anotherCount"๋ก ์ ์ธํ๊ธฐ ๋๋ฌธ์ "myCount$" ๋ฐ "count$"์ ์ก์ธ์คํ ์ ์์ต๋๋ค. ์๋ฌด๋ฐ๋ ์ ์ธํ์ง ์์๊ธฐ ๋๋ฌธ์ ๋จ์ํ ์กด์ฌํ์ง ์์ต๋๋ค.
์์์... ๊ทธ๊ฒ ์์ ์ ๋๋ค. Decorator์์ ์ ์ธํ๋ ๋ฐฉ๋ฒ์ ์ฐพ๊ณ ์์์ต๋๋ค. @hankchiutw ๊ฐ ์๋ฃจ์ ์ ์ ๊ณตํ๋๋ฐ ๊ทธ๋๋ก ์๋ํ์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค.
@mparpaillon ๋ด ์๋ฃจ์ ์ ์ดํด๋ณด์ญ์์ค: https://github.com/Futhark/ngx-observable-input
@Futhark ์ค ๋ฅ๋ค! ๊ณ ๋ง์
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์น์ ํ๋ Angular ํ. 2020๋ ์๋ ๋ฌด์์ด๋ ๊ธฐ๋ํด์ฃผ์ธ์ :-)
๋ํ @jcomputer ์๋ฃจ์ ์ ๋ด๊ฐ ์ํ๋ ๊ฒ์ ๋๋ค. ๋ค๋ฅธ ๋ฐ์ฝ๋ ์ดํฐ ์ด๋ฆ์ ์ด๋ ฌํ ํฌ์ ์๋์ง๋ง
@ViewChild
๊ฐ{ read }
๊ฐ๋ ๊ฒ๊ณผ ์ ์ฌํ ๋งค๊ฐ๋ณ์๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด ๊ฐ๋ฅํฉ๋๋ค. ์: