์ฌ๊ธฐ์ ๋ฌด์จ ๋ฌธ์ ๊ฐ ์์ต๋๊น? http://plnkr.co/edit/nm8OkrpZCIp4cvA6TbpO?p=preview
๋๋ ๋น์ทํ ๋ฌธ์ ์ ์ง๋ฉดํด ์์ผ๋ฉฐ ์์์ด ์ด๊ธฐํ๋๋ ๋ฐฉ์๊ณผ ๋ถ๋ชจ๊ฐ ์ด๊ธฐํ ํ๋ก์ธ์ค์ ์ผ๋ถ๋ก ์์์ ์ ๋ฐ์ดํธํ๋ ๋ฐฉ๋ฒ์ผ๋ก ์ธํด ๋ํ๋ฉ๋๋ค. ๋ค์๊ณผ ๊ฐ์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ฌ http://plnkr.co/edit/GI45u805pnFUtFeORnxn?p=preview ์์ญ์ ์ฌ์ฉํ๋ ์ถ์ ํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์๋ ์ ์ฌํ ์ํ์ด ์์ต๋๋ค.
์์ฑ์(๋น๊ณต๊ฐ _zone : NgZone) { }
ngAfterViewInit() : ๋ฌดํจ {
this._zone.overrideOnTurnDone(() => {
this.child.title = '๋ถ๋ชจ์ ์ ๋ชฉ';
});
}
์ด๊ฒ์ ๋ฒ๊ทธ๊ฐ ์๋๋ผ ์๋ํ ๋๋ก ์๋ํ๋ ๊ฐ๋ฐ ๋ชจ๋์ ๊ธฐ๋ฅ์
๋๋ค. enableProdMode( )
ํธ์ถ - ์ฑ์ ๋ถํธ์คํธ๋ฉํ ๋ ์
๋ฐ์ดํธ๋ plunk๋ฅผ ์ฐธ์กฐ ํ๋ฉด ์์ธ๊ฐ throw๋์ง ์์ต๋๋ค.
์ฆ, ์ ๋นํ ์ด์ ๊ฐ ์์ต๋๋ค. ์ฆ, ๋ชจ๋ ๋ณ๊ฒฝ ๊ฐ์ง ๋ผ์ด๋ ํ dev ๋ชจ๋๋ ์ฆ์ ๋ ๋ฒ์งธ ๋ผ์ด๋๋ฅผ ์ํํ์ฌ ์ฒซ ๋ฒ์งธ ์ข ๋ฃ ์ดํ ๋ฐ์ธ๋ฉ์ด ๋ณ๊ฒฝ๋์ง ์์๋์ง ํ์ธํฉ๋๋ค. ์ด๋ ๋ณ๊ฒฝ์ด ๋ฐ์ํ์์ ๋ํ๋ด๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ณ๊ฒฝ ๊ฐ์ง ์์ฒด์ ์ํด.
๋น์ ์ ์ฟตํ๋ ์๋ฆฌ์, ๋น์ ์ ๋ฐ์ธ๋ฉ ํ [attr.spinner]=isLoading
๋ฐ isLoading
๋ก ํธ์ถ์ ๊ฒฐ๊ณผ๋ก ๋ณ๊ฒฝ this.load()
๋ ๋ฐ์, ngAfterViewInit
๋ฐ์ฌ๋๊ณ , ์ด๋ค ์ด๊ธฐ ๋ณ๊ฒฝ ๊ฐ์ง ์ฐจ๋ก์ ์ผ๋ถ๋ก ๋ฐ์ํฉ๋๋ค. ๊ทธ ์์ฒด๋ก๋ ๋ฌธ์ ๊ฐ ๋์ง ์์ต๋๋ค. ๋ฌธ์ ๋ this.load()
๊ฐ ๋ฐ์ธ๋ฉ์ ๋ณ๊ฒฝํ์ง๋ง ์๋ก์ด ๋ณ๊ฒฝ ๊ฐ์ง ๋ผ์ด๋๋ฅผ ํธ๋ฆฌ๊ฑฐํ์ง ์๋๋ค๋ ๊ฒ์
๋๋ค. ์ฆ, ์ด ๋ฐ์ธ๋ฉ์ ํฅํ ๋ณ๊ฒฝ ๊ฐ์ง ๋ผ์ด๋๊น์ง ์
๋ฐ์ดํธ๋์ง ์์ต๋๋ค.
์ฌ๊ธฐ์ ์ด๊ธฐํ๋ ChildView
๊ฐ ์๊ธฐ ๋๋ฌธ์ afterViewInit
๊ตฌ์ฑ ์์๋ฅผ ์ค์ ํด์ผ ํฉ๋๋ค. isLoading
๋ณ๊ฒฝํ๋ ์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ์ ๋ฌด์์
๋๊น? ์ ๋ฉ ํธ์ถ this.load
๋ก setTimeout
?
๊ทธ ๋ฐฉ๋ฒ ๋์ ๋ค๋ฅธ ๋ณ๊ฒฝ ๊ฐ์ง ๋ผ์ด๋๋ฅผ ํธ๋ฆฌ๊ฑฐํ๋ ๋ฌด์์ด๋ ํ๋ฉด ๋ฉ๋๋ค. ์ด๋ฒคํธ๋ฅผ ๋ด๋ณด๋ด๋ ๊ฒ์ ๋๋ค. ํ์์์(ng1:-P์ ๋ํ ๋๊ธฐ์ด ํ๋์๋ฐฑ)์ผ๋ก ๋ํํ๋ ๊ฒ์ ์๋ํ๋ ํ ๊ฐ์ง ๋ฐฉ๋ฒ์ด์ง๋ง ng2์์๋ ๋งค์ฐ ์ง์ ๋ถํ๊ฒ ๋๊ปด์ง๋๋ค.
์ฌ์ฉ์ ์นํ์ ์ด์ง ์์ต๋๋ค. ๋๋ ๊ทธ ๋ฉ์๋๋ฅผ ์์์ด ์ ์๋ ๋ ๊ตฌ์ฑ ์์ ์ด๊ธฐํ๋ฅผ ์๋ฃํ ์ ์๋ ๊ณณ์ด๋ผ๊ณ ์๊ฐํ๊ณ ์ด์ ๋ ๋ช ๊ฐ์ง ์ฌ์ฉ์ ์ง์ ๊ท์น์ด ์๋ ๊ฒ์ผ๋ก ๋ํ๋ฌ์ต๋๋ค. ์ฌ์ฉ์๋ก๋ถํฐ ng2 ๋ด๋ถ์ ์จ๊ฒจ์ง๋๋ก ๋ด๋ถ์ ์ผ๋ก ์๋ก์ด ๋ณ๊ฒฝ ๊ฐ์ง ๋ผ์ด๋๋ฅผ ๊ฐ์ ์คํํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ฌ๊ธฐ์ ๋ฌ์ฑํ๋ ค๋ ๊ฒ์ ๋ ๋ํ์ ์ธ ์ํ์ ๊ฒ์ํ ์ ์์ต๋๊น? ์ด๋ฏธ์ง ์คํผ๋์ธ ๊ฒฝ์ฐ ํ์ค ๋ฐ์ธ๋ฉ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
@AerisG222๋ ๋ง์ฐฌ๊ฐ์ง ์ ๋๋ค. ์ด๊ฒ์ ๋ฌ์ฑํ๊ธฐ ์ํด ๋จ์ ๋ฐ์ธ๋ฉ์ ์ฌ์ฉํ ์ ์๋ ์ด์ ๊ฐ ์์ต๋๊น? ์์ญ ๋์์ ์ฌ์ ์ํ๋ ๊ฒ์ ์ผ๋ฐ์ ์ผ๋ก ๊ถ์ฅ๋์ง ์์ต๋๋ค.
@robwormald ์, ์ด ๊ฒฝ์ฐ ์์ฑ ๋ฐ์ธ๋ฉ์ ์ํํ ์ ์์ต๋๋ค. ์ค์ ์ฌ๋ก์๋ ์ข ๋ ๋ณต์กํ ๋ ๋ค๋ฅธ ์์ฑ์ด ํฌํจ๋ฉ๋๋ค. ์ฆ, ์ฌ์ฉ์ ์ง์ ๊ฐ์ฒด์ ๋ฐฐ์ด์ด์ง๋ง ์์ฑ ๋ฐ์ธ๋ฉ์ ํตํด ์ค์ ํ ์๋ ์์ต๋๋ค.
@ViewChild
์ ๊ฐ์ ๊ฒ์ด ์์ผ๋ฉด ์ ๋ณด๋ฅผ ์ ๋ฌํ๋ ์ ์ผํ ํฉ๋ฆฌ์ ์ธ ๋ฐฉ๋ฒ์ด๋ฏ๋ก ๊ทธ๋ค์ง ์ ๊ฒฝ ์ฐ์ง ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฌ๋ @ViewChild
๋ฅผ ๋ณด๊ณ ๋งค์ฐ ๊ธฐ๋ปค์ต๋๋ค. ๊ทธ๋์ ์ฝ๋์ ๊ตฌ์ฑ ์์ ์ฐธ์กฐ์ ๋ํด ์์
ํ ์ ์์์ต๋๋ค. ์ด๊ฒ์ ๋งํฌ์
์ ๋จ์ํํ๊ณ ์ฝ๋๋ฅผ ํตํด ๋ ๋ง์ ์ ์ด๋ฅผ ํ์ฉํฉ๋๋ค. ์ด๋ ๋ ๋ง์ ๋๊ตฌ ์ง์(์: ์ธํ
๋ฆฌ์ผ์ค ๋ฐ ์ปดํ์ผ ์๊ฐ ํ์ธ)์ด ์๊ธฐ ๋๋ฌธ์ typescript์ ์ถ๊ฐ๋ก ๊ฐ์น๊ฐ ์์ต๋๋ค. ๋ํ ์์์ ์ํ๋ก๋ง ์ฌ์ฉ๋๋ ๋ฉค๋ฒ ๋ณ์๋ฅผ ์ถ์ ํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ปจํ
์ด๋ ๊ตฌ์ฑ ์์๋ฅผ ๋จ์ํํฉ๋๋ค.
๋ ๋ค๋ฅธ ์ฌ์ํ ์ ์ ์์ฑ ๋ฐ์ธ๋ฉ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ ์์ฉ ํ๋ก๊ทธ๋จ์ ์ดํด๋ณผ ๋ ํ ํ๋ฆฟ์ ๊ฒ์ฌํ์ฌ ๊ถ๊ทน์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ ์ฌ๋์ด ๋๊ตฌ์ธ์ง ํ์ธํด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ ์ฝ๋๋ฅผ ํตํด ์ฐ๊ฒฐ๋ ๋ ๋ ๋ถ๋ช ํ ๊ฒ์ ๋๋ค.
์์ ์์ ์ค์ํ ๊ฒ๋ง ๋ณด์ฌ์ฃผ๊ธฐ ์ํด ์ฝ๋๋ฅผ ์ ๋ฆฌํ์ต๋๋ค. ์์ด๋์ด๋ ์ด๋ฏธ์ง๊ฐ ๋ก๋๋๋ ๋์์๋ง ์คํผ๋๋ฅผ ํ์ํ ๋ค์ ์คํผ๋๋ฅผ ์ ๊ฑฐํ๊ณ ์ด๋ฏธ์ง๋ฅผ ํ์ํ๋ ๊ฒ์ ๋๋ค. ์์๊ฐ ํ๋ฉด์ ํ์๋ ๋๋ง ์ด๋ฏธ์ง๊ฐ ๋ก๋๋ฉ๋๋ค.
inflate.ts
import {Component, Input, Renderer, ElementRef, AfterViewInit, ViewChild} from 'angular2/core';
@Component({
selector: '[inflate]',
templateUrl: './inflate.html',
styleUrls: ['./inflate.css']
})
export class Inflate implements AfterViewInit {
@Input('inflate') url: string;
@ViewChild('holder') holder: ElementRef;
isLoaded = false;
isLoading = false;
constructor(private renderer: Renderer) {}
ngAfterViewInit() {
setTimeout(_=> this.inflate()); // BUGFIX: https://github.com/angular/angular/issues/6005#issuecomment-165911194
}
inflate() {
let bounds = <ClientRect>this.holder.nativeElement.getBoundingClientRect();
if(bounds.bottom > 0 && bounds.top < window.innerHeight) {
this.isLoading = true;
let img = new Image();
img.src = this.url;
img.onload = _=> {
this.isLoaded = true;
this.isLoading = false;
this.renderer.setElementStyle(this.holder,
'background-image', 'url("' + this.url + '")');
};
}
}
}
inflate.html
<image-holder #holder></image-holder>
<spinner *ngIf="isLoading"></spinner>
๋ก๋ ์๋ฃ ์ ์ ๋๋ฉ์ด์ ๊ณผ ํจ๊ป ํ์ด๋์ธ๋๋ ๋์ ํธ์คํธ ๋ฐฐ๊ฒฝ ๋ถํฌ๋ช ๋์ ์ํฅ์ ๋ฏธ์น์ง ์์์ผ ํ๊ธฐ ๋๋ฌธ์ ์ด๋ฏธ์ง๋ฅผ ํธ์คํธ์ ์ ์งํ์ง ์์์ผ ํฉ๋๋ค.
์ค์ฒฉ ์ง์๋ฌธ์ ์ ์ฌ์ ์ผ๋ก ๊ด๋ จ๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
http://plnkr.co/edit/myX2Alx9jie2q0FDIME7?p=preview
์ฌ๊ธฐ์์๋ progressBar.ts์ ngStyle์ ๋ฐ์ธ๋ฉํฉ๋๋ค.
๋๋ ๊ทธ๋ค์ด ๊ฐ์์ ์ฆ๋ช
ํ๊ธฐ ์ํด ๋ฐํํ๊ธฐ ์ ์ ์คํ์ผ ๊ฐ์ฒด๋ฅผ ๊ธฐ๋กํ๊ณ ์์ต๋๋ค.
๋ํ ExpressionChangedAfterItHasBeenCheckedException์ ์ป์ต๋๋ค.
@svi3c ์ค์ ๋ก _different_ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๊ณ ์์ต๋๋ค. ๊ฐ ํจ์ ํธ์ถ์ ํค/๊ฐ ์ธก๋ฉด์์ ์ด์ ์ธ์คํด์ค์ "๋์ผํ" ์ ๊ฐ์ฒด ์ธ์คํด์ค๋ฅผ ๋ฐํํ์ง๋ง ์ธ์คํด์ค/์ฐธ์กฐ ์ธก๋ฉด์์๋ ๊ทธ๋ ์ง ์์ต๋๋ค.
์ด ์ํฉ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์๋ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์์ต๋๋ค.
ChangeDetectionStrategy.OnPush
์ ๋ต์ ์ฌ์ฉํ์ฌ ์
๋ ฅ ์ค ํ๋๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง ํจ์๊ฐ ํธ์ถ๋ฉ๋๋ค(์: http://plnkr.co/edit/NWyVoTtkiAzqWJphLMbi?p=preview).https://github.com/ng-bootstrap/core/blob/master/src/progressbar/progressbar.ts ๋ฅผ ng2์ ๋ํ ์งํ ํ์์ค ์ง์๋ฌธ์ ๋ ๋ค๋ฅธ ์๋ก ํ์ธํ๊ณ ์ถ์ ์๋ ์์ต๋๋ค(๋ถํธ์คํธ๋ฉ์ HTML/CSS ์ฌ์ฉ)
@pkozlowski-opensource ์ ๋ง ๊ฐ์ฌํฉ๋๋ค!
https://angular.io/docs/ts/latest/guide/template-syntax.html#!#ngstyle๋ง ์ฝ์๊ณ ์์ง ๋ณ๊ฒฝ ๊ฐ์ง ์ ๋ต์ ๋ฐ๊ฒฌํ์ง ๋ชปํ์ต๋๋ค. ๋๋จํด! :)
@drew-๋ฌด์ด:
๊ทธ ๋ฐฉ๋ฒ ๋์ ๋ค๋ฅธ ๋ณ๊ฒฝ ๊ฐ์ง ๋ผ์ด๋๋ฅผ ํธ๋ฆฌ๊ฑฐํ๋ ๋ฌด์์ด๋ ํ๋ฉด ๋ฉ๋๋ค. ์ด๋ฒคํธ๋ฅผ ๋ด๋ณด๋ด๋ ๊ฒ์ ๋๋ค.
์
๋ฐ์ดํธํ ์์ฑ๋ง ์์ผ๋ฉด ngAfterViewInit ๋ด์์ ๋ณ๊ฒฝ ๊ฐ์ง๋ฅผ ๋ค์ ํธ๋ฆฌ๊ฑฐํ๋ _correct_ ๋ฐ _simplest_ ๋ฐฉ๋ฒ์ด ๋ฌด์์ธ์ง ์กฐ์ธํด ์ฃผ์๊ฒ ์ต๋๊น? ApplicationRef.tick()
๋ 'ApplicationRef.tick์ด ์ฌ๊ท์ ์ผ๋ก ํธ์ถ๋จ' ์์ธ๋ฅผ ๋ฐ์์ํค๋ฏ๋ก ์ฌ๊ธฐ์์ ์๋ํ์ง ์์ต๋๋ค. ๋ณ๊ฒฝ ๊ฐ์ง๋ฅผ ํธ๋ฆฌ๊ฑฐํ๊ธฐ ์ํด ์ด๋ฒคํธ๋ฅผ ๋ด๋ณด๋ด๋ ๊ฒ์ ์๋ชป ๋๊ปด์ง๊ณ (์ ์๊ฒ๋ ํจ๊ณผ๊ฐ ์์์ต๋๋ค) setTimeout
๋ง์ฐฌ๊ฐ์ง์
๋๋ค.
์ฌ๊ธฐ์ ์๋ ์ฃผ์์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ฉด ngAfterViewInit์์ ๋ฐ์ธ๋ฉ๋ ์์ฑ์ ์ ๋ฐ์ดํธํ๋ ๊ฒ์ด ์๋นํ ์ผ๋ฐ์ ์ธ ์๊ตฌ ์ฌํญ์ธ ๊ฒ ๊ฐ์ต๋๋ค(์์ ๊ตฌ์ฑ ์์์ ๋ํ ์ข ์์ฑ์ผ๋ก ์ธํด). ๋ฐ๋ผ์ Angular 2์๋ ์ด๋ฅผ ์ํํ๋ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ด ๋๋ฝ๋ ๊ฒ ๊ฐ์ต๋๋ค.
ngAfterViewInit์์ ๋ฐ์ธ๋ฉ๋ ์์ฑ์ ์ ๋ฐ์ดํธํ๋ ๊ฒ์ด _์๋ชป๋_ ์ผ์ด๋ผ๋ฉด ๋์์ ๋ฌด์์ ๋๊น?
๋ค์์ ๋น ๋ฅธ ๊ฒ์ ๋๋ค.
๋์ :
๋ ๋๋ง๋ ๋๋น๋ฅผ ๊ธฐ๋ฐ์ผ๋ก dom ์์์ ๋์ด(ํน์ ๊ณต์์ ํตํด)๋ฅผ ์ค์ ํฉ๋๋ค.
๊ธฐ๋:
์์๊ฐ ๋ ๋๋ง๋๋ฉด ๋๋น๋ฅผ ๊ฐ์ ธ์ค๊ณ ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋์ด๋ฅผ ๊ณ์ฐํฉ๋๋ค.
ํ์ค:
์๊ฐ ์ด๊ณผ?!
ngAfterViewInit() {
window.setTimeout(() =>
this.elementHeight = (this.nativeElement.offsetWidth * this.randomImage.dim.h) / this.randomImage.dim.w
)
}
@Birowsky ํ ๋ฐ์ปค?
@zoechi ๋ค์์ ์์ ๋๋ค. http://plnkr.co/edit/MML5uHEFQdL0k0TA5HtY
ngAfterViewInit
์๋ช
์ฃผ๊ธฐ ํํฌ์์ setTimeout
in app/app.component.ts#21
๋ฅผ ํ ๊ธํ ์ ์์ต๋๋ค.
์ฌ์ฉ์ ์ ์ ngModel
valueAccessor
์ writeValue( newValue )
๋ฉ์๋๋ฅผ ๊ตฌํํ๋ ค๊ณ ํ ๋๋ ๋น์ทํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. ๊ตฌ์ฑ ์์์ newValue๋ฅผ ์ ์ฉํ๋ ค๊ณ ํ๋ฉด ๊ฐ์ด ๋ณ๊ฒฝ๋์์์ ์๋ ค์ค๋๋ค(๋์ ๋ฐฉ์์ผ๋ก). ๋ชจ๋๊ฐ ๋ฐ๊ฒฌํ ๊ฒ์ฒ๋ผ setTimeout()์ผ๋ก ๋ํํ๋ฉด "์์ "๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ์ข์ ๋ฐฉ๋ฒ์ ์๋๋๋ค.
๋ค๋ฅธ ์๊ฐ ์์ต๋๋ค. @HostBinding()
๊ฐ ์ค์ ๋๊ณ QueryList
์ํด ์๋ฆผ์ ๋ฐ๋๋ค๋ ์ ์์ ์๋นํ ๊ฐ๋จํฉ๋๋ค.
๋ด ๋ฌธ์ # 5950๊ณผ ๋์ผํฉ๋๋ค.
์ด ์์
์ ๊น๋ํ๊ฒ ์ํํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๋ช ๊ฐ์ง ๊ถ์ฅ ์ฌํญ์ด ์์ต๋๋ค.
http://stackoverflow.com/questions/34827334/triggering-angular2-change-detection-manually
๊ทธ๋ฌ๋ ํ์ํ ์์
์ ์ํํ ์ ์์๊ธฐ ๋๋ฌธ์ ์ฌ์ ํ setTimeout
๋ํํ๊ณ ์์ต๋๋ค. ์ฝ๋ฐฑ์ด ๋๋ ๋ ChangeDetectorRef.detectChanges()
ํ ์ ์๊ณ CD๋ฅผ ํธ๋ฆฌ๊ฑฐํ ์ ์๋ ๊ฒ ๊ฐ์ต๋๋ค...
HTML5 ๋ฏธ๋์ด ์์ค ํ์ฅ์ ์ฌ์ฉํ์ฌ ๋น๋์ค ์์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ค๋์ค ์ปจํ
์คํธ๋ฅผ ์์ฑํ๋ฏ๋ก @ViewChild
๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ์ค๋์ค ์ปจํ
์คํธ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ฑ๋ ์์ ๊ฐ์ ์ผ๋ถ ์ ๋ณด๋ฅผ ํ์ํ๋ ค๊ณ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋๋์ด ๋ฌธ์ ๋ ๊ฒช์์ต๋๋ค. ์ด๊ฒ์ ์ฐํํ๋ ์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ์ ๋ฌด์์
๋๊น?
@ElsewhereGames ์ค์ ์ฝ๋๋ฅผ ๋ณด์ง ์๊ณ ๋ ๋งํ๊ธฐ ์ด๋ ต์ต๋๋ค. Plunker๋ฅผ ๋ง๋ค ์ ์์ต๋๊น?
@zoechi ๋ณด๊ณ ํ ์ค์ ๋ฒ๊ทธ๊ฐ ์์ต๋๋ค. DOM์ ์ง์ ์ก์ธ์คํ์ง ์๋ ๊ฒ์ด ๋ฐ๋์งํ์ง๋ง ํญ์ ํผํ ์ ์๋ ๊ฒ์ ์๋๋๋ค( @robwormald ์ฃผ์์ ๋ํ ์๋ต). ์ค์ API๋ createMediaElementSource ๋ฌธ์๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
1์์ _ngModel_ ๋ฌธ์ ๋ก ๋ค์ ๊ฒ์ํ์ต๋๋ค. ์ด์ _ViewChildren_ ๋ฌธ์ ๋ก ๋ค์ ๋์์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ฌํ ๋ค๋ฅธ ์์ ๋ฌ๋ฆฌ ์ ๋ ์ค์ ๋ก ๋ฐ๋ชจ์์ ์๋ฌด ๊ฒ๋ ํ๋ ค๊ณ ํ์ง ์์ต๋๋ค. ์ฆ, ๋ด ์ปจํธ๋กค๋ฌ์๋ ๋ ผ๋ฆฌ๊ฐ ์์ต๋๋ค. ๋ชจ๋ ๋ฉํ ๋ฐ์ดํฐ์ ๋ทฐ ๋ฐ์ธ๋ฉ์ ๋๋ค. ๋ฐ๋ผ์ _ ์๋ง์ผ๋ก ๋ง๋ค ๊ณต๊ฐ์ด ์ด๋ ์๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
๋น์ทํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง๋ง ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ฝ๋๋ฅผ ๋ค์ ์์ฑํ ์ ์์ต๋๋ค. @bennadel ํฌ์คํ ์
https://github.com/angular/angular/issues/6618
์ง๊ธ๊น์ง๋ ํญ์ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์์ง๋ง ์ต์ํ ๋ณ๊ฒฝ ๊ฐ์ง ๋ฉ์ปค๋์ฆ์ด ๋ ๋ง์ ๋ฌธ์๋ฅผ ์ฌ์ฉํ ์ ์์์ ์ฌ๊ธฐ์ ๋ค์ ์ ์ํฉ๋๋ค. @bennadel ๊ทํ์ ๋ฌธ์ ๋ ๋ค๋ฅธ ๋ฌธ์ ๋ฅผ ์๊ฐ๋๊ฒ ํฉ๋๋ค.
https://github.com/angular/angular/issues/5177
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ถ๊ฐ ์๋ช ์ฃผ๊ธฐ ํํฌ๋ฅผ OnBeforeBinding/OnBeforeRendering์ ์ถ๊ฐํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ํด๋น ์๋ฃจ์ ์ด ๊ทํ์ ๋ฌธ์ ๋ ํด๊ฒฐ๋ ๊ฒ ๊ฐ์ต๋๋ค.
@tandu ngAfterViewInit
๋ฅผ ngOnInit
๋ฐ๊พธ ์ธ์.
@e-oz https://github.com/angular/angular/issues/6005#issuecomment -165906207
@tandu ์คํผ๋๊ฐ ์ธ์ ์์๋๋์ง(์์ ๋ก๋, ์์์ ์ด๋ฏธ์ง ๋ก๋ - ์ฌ์ฉ์์ ๊ฒฝ์ฐ ๋ชจ๋ ๊ฒ์ด ๋ก๋๋จ)๋ ์ค์ ๋ก ์ค์ํ์ง ์์ผ๋ฉฐ
@e-oz https://github.com/angular/angular/issues/6005#issuecomment -165951692 ์ด๋ฏธ์ง ๋ก๋๋ฅผ ์์ํด์ผ ํ๋์ง ๊ฐ์งํ๊ธฐ ์ํด ์์ ๊ฒฝ๊ณ์ ์ก์ธ์คํฉ๋๋ค.
@tandu ๋ฐ ์ด ๋ชจ๋ ๊ฒ์ฌ๋ฅผ ์์ ๊ตฌ์ฑ ์์ ์ฝ๋๋ก ์ด๋ํ๊ณ (์์ ๊ตฌ์ฑ ์์์ ngAfterViewInit์์ ํฉ๋ฒ์ ์) isLoading์ ๋ณ๊ฒฝํ ๋ ๋ถ๋ชจ์๊ฒ ์ด๋ฒคํธ๋ฅผ ๋ณด๋ผ ์ ์์ต๋๋ค.
@e-oz html: <image-holder #holder></image-holder>
์์ ๊ตฌ์ฑ ์์๋ฅผ #holder
๋ก ์ ์ํฉ๋๋ค. ๋ฐ๋ผ์ js ํ์ผ์ด ์์ต๋๋ค.
๋ฐ๋ผ์ ์์ฑํ์ญ์์ค. ๊ทธ๋ ์ง ์์ผ๋ฉด View๊ฐ ์๋ ๊ฒฝ์ฐ ngAfterViewInit๋ฅผ ์ฌ์ฉํ ํ์๊ฐ ์์ต๋๋ค.
์์์ผ๋ก ์ค์ ๊ตฌ์ฑ ์์๊ฐ ์์ต๋๋ค - ์๋ฌด ๊ฒ๋ ๋ ๋๋ง๋์ง ์์ต๋๋ค.
2016๋ 3์ 13์ผ ์ผ์์ผ 15:18 tandu [email protected]์์ ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
@e-oz https://github.com/e-oz HTML์์ ๊ตฌ์ฑ ์์๋ฅผ #holder๋ก ์ ์ํฉ๋๋ค.
. ๋ฐ๋ผ์ js ํ์ผ์ด ์์ต๋๋ค. ํ๋>
โ
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ฑฐ๋ GitHub์์ ํ์ธํ์ธ์.
https://github.com/angular/angular/issues/6005#issuecomment -195963389.
element.getElementsByTagsName
๋๋ ์ด์ ์ ์ฌํ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์๋ ์๊ณ ChildComponent๋ฅผ ์ฌ์ฉํ์ง ์์ ์๋ ์์ต๋๋ค. ํ์คํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. setTimeout
์์ ์ ๊ด์ฐฎ์ต๋๋ค. ๋ฌธ์ ๋ ๋ฉ์๋ ์ด๋ฆ์ด ์์ ๊ตฌ์ฑ ์์๊ฐ ์ด๊ธฐํ๋๊ณ ๊ตฌ์ฑ ์์์ ๋ฐ์ธ๋ฉ๋๊ธฐ๋ฅผ ์ํ๋ ์ผ๋ถ ๋
ผ๋ฆฌ๋ฅผ ์ ์ํ๋ ๋ฐ ์ฌ์ฉํ ์ ์์์ ์์ฌํ์ง๋ง ๋ฉ์๋๋ ๋ณ๊ฒฝ ๊ฐ์ง ์ฃผ๊ธฐ์ ์ค๊ฐ์ ์คํ๋๋ค๋ ๊ฒ์ ์๋ ค์ฃผ์ง ์๊ธฐ ๋๋ฌธ์ ์ฐ๋ฆฌ๋ ๊ธด ์๊ฐ์ด ํ์ํฉ๋๋ค. ๋ค์ํ ์ฌ๋๋ค์ ๋ถ๋ง ์ค๋ ๋.
@tandu ๋๋ ์ด๊ฒ์ ์ ๋์ ์ผ๋ก ๋์ํฉ๋๋ค. ์ด๊ฒ์ ๋งค์ฐ ์ฑ๊ฐ์ ์ ํ์ ๋๋ค.
๊ทธ๋งํ ๊ฐ์น๊ฐ ์๊ธฐ ๋๋ฌธ์ ์๋ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ด ๋ณ๊ฒฝํ์ต๋๋ค. ์ด๋ ํฉ๋ฆฌ์ ์ธ ์ ๊ทผ ๋ฐฉ์์ฒ๋ผ ๋๊ปด์ง๊ธฐ ์์ํ์ต๋๋ค. ์๋ง๋ ์ด๊ฒ์ ๊ทํ์ ์ํฉ์ ๋ํด ์๋ํด ๋ณผ ๊ฐ์น๊ฐ ์์ต๋๋ค.
constructor(private _changeDetectionRef : ChangeDetectorRef) { }
ngAfterViewInit() : void {
// your code
this._changeDetectionRef.detectChanges();
}
์์ ์ ํจ์ฑ ๊ฒ์ฌ(ํ์ ์ ๋ ฅ)๋ฅผ ์ฌ์ฉํ ๋ ๋์ผํ ์์ธ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ด ๋ฌธ์ ์ ๊ด๋ จ์ด ์์ต๋๊น?
ํ๋ฐ์ปค: http://plnkr.co/edit/Fp6XT5mC6ZCB14Z1gvTi?p=preview
@eivindr ์ ๋น ๋ฅด๊ฒ ์ดํด๋ณด์๊ณ ์ด์ ์ ์ ๋ ฅ์์ ngFormControl์ ๋ณธ ์ ์ด ์์์ต๋๋ค. ์ ์ด ๊ทธ๋ฃน์ ๋ฐ์ธ๋ฉํ๊ธฐ ์ํด ์์ ์์๋ก ์ด๋ํด์ผ ํ๊ณ ๊ฐ๋ณ ์ ๋ ฅ์๋ ํด๋นํ๋ ng์ปจํธ๋กค. ์ด๋ค ๊ฒฝ์ฐ์๋ ํ๋ฐ์ปค์์ ์ ๊ฑฐํ์ญ์์ค.
[ngFormControl]="formModel.find('title')"
๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ๋น์ ์ ์ค๋ฅ๋ฅผ ์์ ํฉ๋๋ค.
์ ๋ ์ด ๋ฌธ์ ๋ฅผ ์ญ์ ํ๋ ๊ฒ์ ๊ฑฐ๋ถํฉ๋๋ค. :) ์ด์ ์ ๋ ์ ๋ฌธ์ ๊ฐ ํนํ ์ ๋ ฅ ์์ฑ์ ์์กดํ๋ ํธ์คํธ ๋ฐ์ธ๋ฉ ๊ณผ ๊ด๋ จ๋์ด ์์์ ์ ์ฆํ ์ ์์์ต๋๋ค.
๊ตฌ์ฑ ์์์๋ ๋ณด๊ธฐ ํ ํ๋ฆฟ๊ณผ ํธ์คํธ ๋ฐ์ธ๋ฉ์ด๋ผ๋ ๋ ๊ฐ์ง ์ ๋ ฅ์ ์์กดํ๋ ๊ฒ์ด ์๊ณ _๊ทธ ์ค ํ๋๋ง์ด ๋ณ๊ฒฝ ์์ธ๋ฅผ ์ผ์ผํค๊ธฐ ๋๋ฌธ์ ์ด ์์ ์์ ์ด๊ฒ์ด ๋ฒ๊ทธ ๋ผ๊ณ ๋ฏฟ์ด์ผ ํฉ๋๋ค. ๋ ๋ค ๋ฌธ์ ๋ฅผ ์ผ์ผ์ผฐ๋ค๋ฉด ๋ค๋ฅธ ์๊ฐ์ ํ์ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ ์ค ํ๋๋ง์ด ๋ฌธ์ ๋ฅผ ์ผ์ผํค๋ ๊ฒ์ด๋ฏ๋ก ๋ฒ๊ทธ ์ผ ๊ฒ์ ๋๋ค.
@eivindr ๋น ์์์ผ๋ก ์์ํ ๋ค์ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก ์์ ์ปจํธ๋กค์ ๊ฐ์ ์ค์ ํ ๋๋ ๋์ผํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ฐพ์์ต๋๊น?
@MarkPerryBV ์๋์, required๋ฅผ ์ฌ์ฉํ ๋ ์ฌ์ ํ "ํ์ธ๋ ํ ๋ณ๊ฒฝ๋์์ต๋๋ค"๋ผ๋ ๋ฉ์์ง๊ฐ ํ์๋ฉ๋๋ค. ํจํด ์ ํจ์ฑ ๊ฒ์ฌ๊ธฐ๋ฅผ ์ฌ์ฉํ ๋๋ ๋์ผํฉ๋๋ค. ๊ทธ๋ฌ๋ minLength ๋ฑ์ด ์๋ํฉ๋๋ค.
@ user414 [ngFormControl]์ ์ ๊ฑฐํ๋ฉด... ์ ๋ ฅ์ "ํ์" ์ ํจ์ฑ ๊ฒ์ฌ๊ฐ ์์ต๋๋ค.
@MarkPerryBV ๋์๊ฒ ๋ง๋ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ฐพ์์ต๋๋ค(ํ์ฌ๋ก์๋). ProdMode()๋ฅผ ํ์ฑํํด์ผ ํ์ต๋๋ค. ์ ๋ ฅ์ ngIf๋ฅผ ์ฌ์ฉํ๊ณ ์์ผ๋ฏ๋ก ์ ๋ ฅ์ด ๋ ๋๋ง๋ ํ ChangeDetectorRef.detectChanges()๋ ์ํํด์ผ ํ์ต๋๋ค(๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ๋ด์ฉ์ด ์์์๋ ์ ๋ ฅ์ด ์ ํจํ์ง ์์).
enableProdMode()
์ฌ์ฉํด๋ ์ค์ ๋ก๋ ์๋ฌด ๊ฒ๋ ํด๊ฒฐ๋์ง ์์ต๋๋ค. ์ฌํ์ธ์ ์ค์งํ๊ณ ๋ฌด์ธ๊ฐ ์๋ชป๋์์ ์ ์์์ ์๋ ค์ค์ผ๋ก์จ ์ฆ์์ ๊ฐ๋ฆด ๋ฟ์
๋๋ค.
AerisG222์ ์์ ์ setTimeout
์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค ๋์ ๊ฒ ๊ฐ์ต๋๋ค. ์ ํจ์ฑ ๊ฒ์ฌ๊ธฐ๋ก addControl()
๋ฅผ ํธ์ถํ ํ ์๋์ผ๋ก ๋ณ๊ฒฝ ๊ฐ์ง๋ฅผ ํธ๋ฆฌ๊ฑฐํด์ผ ํ๋ ๋์์ด ์๋๋ ๊ฒฝ์ฐ์
๋๊น?
addControl()์ ํธ์ถํ ํ์๋ ๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. addControl()์ด ChangeDetectionRef.detectChanges()๋ฅผ ํธ์ถํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
@CaptainCodeman ์๊ณ ์์ต๋๋ค - ์์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด์์ต๋๋ค.
ng2@beta17 , [email protected] , ์์ญ์ ์ฌ์ฉํ ๋ ๊ฐ๋ฐ ๋ชจ๋์์ ๋ ์ด์ ์คํจํ์ง ์์ต๋๋ค. [email protected]. ๋๋ ์ฌ์ ํ ChangeDetectionRef.detectChanges()๋ฅผ ํธ์ถํด์ผ ํฉ๋๋ค.
@eivindr plnkr์ beta17 ์์ ์ผ๋ก ์
๋ฐ์ดํธํ ์ ์์ต๋๊น?
๋๋ ์ด๊ฒ์ ๋ํด ์ ์ ์ ์๊ณ ์์ด enableProdMode()
์ ์ถ์ ๊ฑฐ๋ถํฉ๋๋ค.
@AerisG222 ๋น์ ์ ์ ๊ทผ ๋ฐฉ์์ด ์ ์๊ฒ ํจ๊ณผ์ ์ ๋๋ค!
@AerisG222๊ฐ ๊ฒ์ํ ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ ์ ๊ทผ ๋ฐฉ์์
๋๊น? ์, ์๋ํ์ง๋ง changeDetectionRef.detectChanges()
๋ฅผ ์๋์ผ๋ก ํธ๋ฆฌ๊ฑฐํ๋ ์์ฌ์ด ์์ต๋๊น?
๋์ ์์ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ์ํํ ๋ค์ ์์์ ์ฌ์ค์ ํ ๋๋ ๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ฌ๊ธฐ ๋ด ํ๋ญํฌ๊ฐ ์์ต๋๋ค
์ฌํ ๋จ๊ณ. Is Employee Checked๋ก ์์์ ์ ์ถํ์ญ์์ค. ์์์ ์๋ก ๊ณ ์น ํ Is Employee๋ฅผ ๋ค์ ํ์ธํ์ญ์์ค.
์ ์ถ ๊ธฐ๋ฅ์์ changeDetectionRef.detectChanges()๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
@AerisG222 ๊ฐ์ฌํฉ๋๋ค :)
๋๋ ๊ทธ ๋ชจ๋ setTimeout ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ข์ํ์ง ์์ต๋๋ค. ๋ค์์ ์ ์ํฉ๋๋ค.
http://plnkr.co/edit/9umnTGsdFWhbaOBeftuZ?p=preview
ChangeDetectorRef.detectChanges
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ํญ์ ์ข์ ๋ฐฉ๋ฒ์ ์๋๋๋ค. ์ด์ ์:
์์ ๊ตฌ์ฑ ์์๋ ngAfterViewInit
๋์ ํ์ ๊ตฌ์ฑ ์์์ ๊ณต๊ฐ API๋ฅผ ํธ์ถํฉ๋๋ค. ์ด ํธ์ถ์ ์์์ ๋ฐ์ธ๋ฉ์ ๋ณ๊ฒฝํฉ๋๋ค. ๋ถ๋ชจ๋ก๋ถํฐ detectChanges
๋ฅผ ํธ์ถํ๋ฉด ๋ฌธ์ ๋ ํด๊ฒฐ๋์ง๋ง, ์ด๋ ๋ถ๋ชจ๊ฐ ์์์ API ํธ์ถ ์ดํ์ detectChanges
์ธ์ ํธ์ถํด์ผ ํ๋์ง ์์์ผ ํจ์ ์๋ฏธํฉ๋๋ค. ChangeDetectionStrategy.OnPush
๋ฅผ ์ฌ์ฉํ๋ ค๊ณ ํ ๋ ์ด ๊ฒฝ์ฐ ๋ฐ์ธ๋ฉ์ ๋ณ๊ฒฝํ๋ childs ๋ฉ์๋์์ detectChanges
๋ฅผ ํธ์ถํ๋ฉด ์๋ํ์ง ์๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
ViewContainerRef.createComponent()
๋ฅผ ํตํด ์์์ ๋์ ์ผ๋ก ์ถ๊ฐํ ๋ค์ ์์ ์ธ์คํด์ค๋ฅผ ์
๋ฐ์ดํธํ ๋ ์ด ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค. ์ ๋ RC2๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
์ฒ์์๋ ์ ์๋ํ์ง๋ง(์ฒซ ๋ฒ์งธ ๋ ๋๋ง) ์ ๋ฐ์ดํฐ๋ฅผ ๋ด๋ณด๋ด๋ ๊ตฌ์ฑ ์์๋ฅผ ์ถ๊ฐํ์ต๋๋ค. ์ด ์ด๋ฒคํธ๋ ๋ณ๊ฒฝ ๊ฐ์ง ๋ฐ ์๋ก์ด ๋์ ํ์ ๊ตฌ์ฑ ์์ ์ฑ์ฐ๊ธฐ๋ฅผ ํธ๋ฆฌ๊ฑฐํ๋ ๋ฐ์ดํฐ ๋ฐฐ์ด์ ์ ๋ฐ์ดํธํ ์์ ๊ตฌ์ฑ ์์์์ ์์ ๋์์ต๋๋ค. ์ด๋ฒคํธ๊ฐ ์์ ์ ์ถ์ ์ํด ํธ๋ฆฌ๊ฑฐ๋์์ต๋๋ค. ์ ์ถ ๋ฒํผ์ ๋๋ฅด๋ฉด ๋ชจ๋ ๊ฒ์ด ์ ์์ ๋๋ค. Enter ํค๋ฅผ ๋๋ฌ ์ ์ถ์ ์์ฑํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
๋์ ๊ตฌ์ฑ ์์๋ฅผ ๋ง๋ค๊ณ ์
๋ฐ์ดํธํ ์งํ์ ChangeDetectorRef.detectChanges()
์ถ๊ฐํ์ต๋๋ค. ํฐ ๋ฌธ์ ๋ ์๋์ง๋ง ๋ณด๊ธฐ์ ์ ๊ตฌ์ฑ ์์๋ฅผ ์ถ๊ฐํ๋๋ฐ๋ ์์คํ
์ด ์์์ ๋ํ ๋ณ๊ฒฝ ๊ฐ์ง๋ฅผ ์๋์ผ๋ก ํธ๋ฆฌ๊ฑฐํ์ง ์๋ ๊ฒ์ด ์ด์ํ๊ฒ ๋ณด์
๋๋ค.
@aerisg222 ๋ชจ๋ ์์ ์์ฑ์ด ๋ถ๋ชจ์์ ๋ณ๊ฒฝ๋ ํ this._changeDetectionRef.detectChanges()๋ฅผ ํธ์ถํด์ผ ํ๋์?
๊ธ์, ๋ฐฉ๊ธ์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. ๋์ผํ ๋ฐ์ดํฐ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ๋ ๊ฐ์ ํ์ ๊ตฌ์ฑ ์์๊ฐ ์์ต๋๋ค. ๋ ๊ฐ์ฒด ๋ชจ๋ ๋ฐ์ดํฐ ์์ค๋ฅผ ์ ๋ฐ์ดํธํ ์ ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ๋ค๋ฅธ ์์ค๋ ์ค์ ๋ก ๊ฐ์ฒด์ ๋ณ๊ฒฝ ์ฌํญ์ ํ์ธํ์ง๋ง ํ์ธ๋ ํ ํํ์์ด ๋ณ๊ฒฝ๋์์์ ํธ๋ฆฌ๊ฑฐํฉ๋๋ค. ์ด์ ๊ฐ: 'true'. ํ์ฌ ๊ฐ: '๊ฑฐ์ง'
์ด๊ฒ์ RC1์์ RC4๋ก ์ ๊ทธ๋ ์ด๋ ํ ํ ๋์๊ฒ ์ผ์ด๋ฌ์ต๋๋ค.
์ฌ๊ธฐ๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค. RC1์์ RC4๋ก ์ ๊ทธ๋ ์ด๋ํ ํ ๋ค์ ๋ฐ๊ธฐ ์์ํ์ต๋๋ค.
์๋ง๋ ์ด๊ฒ์ ์ผ์ผํจ ๋ณ๊ฒฝ ์ฌํญ์ ๋ณ๊ฒฝ ๋ก๊ทธ์ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ผ๋ก ์ ๋ฌ๋์ด์ผ ํ์ ๊ฒ์ ๋๋ค. ๋ด ๋ฌผ๊ฑด์ด ์ด์ ์์๋์์ต๋๋ค.
๊ฒฐ์น์ ์ ๊ธฐ๋ค๋ ค์ผ ํฉ๋๋ค.
์ธ๋ถ ์์ฑ ์
๋ฐ์ดํธ๊ฐ ๊ท์ฐฎ์์ ์์ ๊ตฌ์ฑ ์์ ์ฌ์ฉ์ ์ค๋จํ์ต๋๋ค.
๋๋ ๊ทธ๊ฒ์ ์ํด ์์ญ์ด ์ฌ๊ธฐ์ ์๋ค๊ณ ์๊ฐํ์ต๋๋ค ...
์ฌ๊ธฐ๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค. ViewComponentRef๋ฅผ ํตํ ๋์ ๊ตฌ์ฑ ์์ ๋ก๋ฉ์ RC1์์์ ๊ฐ์ด RC2์ RC4์์ ๋ค๋ฅด๊ฒ ๋์ํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋ด ์์
์ข
์์ฑ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
"์ข
์์ฑ": {
"@๊ฐ๋/๊ณตํต": "2.0.0-rc.1",
"@๊ฐ๋/์ปดํ์ผ๋ฌ": "2.0.0-rc.1",
"@๊ฐ๋/์ฝ์ด": "2.0.0-rc.1",
"@angular/http": "2.0.0-rc.1",
"@angular/platform-browser": "2.0.0-rc.1",
"@angular/platform-browser-dynamic": "2.0.0-rc.1",
"systemjs": "0.19.31",
"core-js": "^2.4.0",
"๋ฉํ๋ฐ์ดํฐ ๋ฐ์": "^0.1.3",
"rxjs": "5.0.0-๋ฒ ํ.6",
"zone.js": "^0.6.12"
},
"devDependencies": {
"typescript": "^1.8.10",
"์
๋ ฅ":"^1.0.4",
"๋์์": "^2.2.0",
"๋ผ์ดํธ ์๋ฒ": "^2.2.2"
}
๊ทธ๋ฆฌ๊ณ ๋ค์์ ์ธ๊ธ๋ ์ค๋ฅ๋ฅผ ์์ฑํ๋ ์ข
์์ฑ์
๋๋ค.
"์ข
์์ฑ": {
"@angular/common": "2.0.0-rc.4",
"@angular/์ปดํ์ผ๋ฌ": "2.0.0-rc.4",
"@๊ฐ๋/์ฝ์ด": "2.0.0-rc.4",
"@angular/http": "2.0.0-rc.4",
"@angular/platform-browser": "2.0.0-rc.4",
"@angular/platform-browser-dynamic": "2.0.0-rc.4",
"systemjs": "0.19.31",
"core-js": "^2.4.0",
"๋ฉํ๋ฐ์ดํฐ ๋ฐ์": "^0.1.3",
"rxjs": "5.0.0-beta.6",
"zone.js": "^0.6.12"
},
"devDependencies": {
"typescript": "^1.8.10",
"์
๋ ฅ":"^1.0.4",
"๋์์": "^2.2.0",
"๋ผ์ดํธ ์๋ฒ": "^2.2.2"
}
RC2๋ ์๋ํ์ง ์์ต๋๋ค!
์ง๋ฌธ์ด์ง๋ง ์ค๋ฅ์ ๋ํด ๋ ๋ง์ ์ ๋ณด๋ฅผ ์ป์ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์ต๋๊น? ์๋ฅผ ๋ค์ด "ํํ์์ด 'true'์์ 'false'๋ก ๋ณ๊ฒฝ๋ฉ๋๋ค!
RC1์์ RC4๋ก ์
๊ทธ๋ ์ด๋ํ ํ์๋ ๋๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ด๊ฐ ์์๋ธ ๊ฒ์ ๋ด Component์ ngOnInit
๊ธฐ๋ฅ ๋๋ฌธ์
๋๋ค. ์ด ๊ธฐ๋ฅ์ ์ฃผ์ ์ฒ๋ฆฌํ๋ฉด ์ค๋ฅ ๋ฉ์์ง๊ฐ ์ฌ๋ผ์ง๊ณ ๋ชจ๋ ๊ฒ์ด ์ ์๋ํฉ๋๋ค. ์ด๊ฒฌ์๋ ์ฌ๋?
์ด ๋ฌธ์ ๋ ์ค๋๋์๊ณ ์กฐ์น๋ฅผ ์ทจํ์ผ๋ฏ๋ก ์ข ๋ฃํฉ๋๋ค. ์ฌ์ ํ ๋ฌธ์ ๊ฐ ์๋ ๊ฒฝ์ฐ ์ ๋ฌธ์ ๋ฅผ ๋ง๋ค๊ณ ๋ชจ๋ ํ์ ์ธ๋ถ์ ๋ณด๋ก ๋ฌธ์ ํ ํ๋ฆฟ์ ์์ฑ
๊ทธ๋ฌ๋ ์ฌ๋๋ค์ ์๋ก์ด rc์์ ์ฌ์ ํ ์ด ๋ฌธ์ ๋ฅผ ๊ฒช๊ณ ์๋ค๊ณ ๋งํ์ต๋๋ค...
2016๋
7์ 13์ผ ์์์ผ 00:52, Victor Berchet [email protected]
์ผ๋ค:
ํ์ #6005 https://github.com/angular/angular/issues/6005.
โ
๋น์ ์ด ์ธ๊ธ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๋ ๊ฒ์ ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/angular/angular/issues/6005#event -720794445 ๋๋ ์์๊ฑฐ
์ค๋ ๋
https://github.com/notifications/unsubscribe/AAgIEFEVZmE0M53XxNpzAYg9hJT_E_viks5qVAyGgaJpZM4G4J_s
.
์, ๋ฐฉ๊ธ RC4๋ก ์ ๊ทธ๋ ์ด๋ํ์ผ๋ฉฐ ์ ๋ผ์ฐํฐ๋ฅผ ๊ตฌ์ฑํ๋ ๊ฒ ์ธ์๋ ๊ตฌ์ฑ ์์๋ฅผ ํ๋๋ ๋ณ๊ฒฝํ์ง ์์๋๋ฐ ์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. RC1์์๋ ๋ชจ๋ ๊ฒ์ด ์ข์์ต๋๋ค. ์ด๊ฒ์ ์ฌ์ ํ โโ์ฃผ๋ณ์์๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋ ๋ง์ ์ ๋ณด:
ngOnInit
๋ด๋ถ์ async
ํธ์ถ๋ก ์ธํด ์ด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ๋น๋๊ธฐ ํธ์ถ ์ฝ๋๋ฅผ ์ฃผ์ ์ฒ๋ฆฌํ๊ฑฐ๋ ํด๋น ์ฝ๋๋ฅผ ์์ฑ์๋ก ์ด๋ํ๋ฉด ๋ชจ๋ ๊ฒ์ด ์ ๋๋ก ์๋ํฉ๋๋ค.
@ammar91
๋ณ๊ฒฝ ํ์ ์ด๊ฒ์ ํธ์ถํ์ญ์์ค.
changeDetectionRef.detectChanges()
@zigzag95 ์, ์ด๊ฒ์ ์ค์ ๋ก ํด๊ฒฐ ๋ฐฉ๋ฒ์ด์ง๋ง ์ด๋ ๊ฒ ํ๋ ๊ฒ์ ๋งค์ฐ ํดํคํ๊ฒ ๋๊ปด์ง๋๋ค. Angular์ ๊ฐ์ ํ๋ ์์ํฌ๊ฐ ์์ฒด ๋ณ๊ฒฝ ๊ฐ์ง ๋ฉ์ปค๋์ฆ์ ์๋์ผ๋ก ํธ๋ฆฌ๊ฑฐํ๋ ๊ฒ๋ณด๋ค ๋ ์ฐ์ํ๊ฒ ์ฒ๋ฆฌํ ๊ฒ์ผ๋ก ๊ธฐ๋ํฉ๋๋ค.
์ ๊ฒฝ์ฐ์๋ ์งํ๋ฅ ํ์์ค์ ํ์ํ๊ณ ์จ๊ธฐ๊ธฐ ์ํด app.component.ts
๊ฐ๋ ์ด๋ฒคํธ ์ด๋ฏธํฐ๋ฅผ ๊ตฌ๋
ํ ๋ ๋ฐ์ํฉ๋๋ค. RC1์์๋ ๋ชจ๋ ์ข์์ง๋ง RC4์์๋ ์ค๋จ๋์์ต๋๋ค.
๋ค์์ ์ฌํ์
๋๋ค. http://plnkr.co/edit/jEtfUrQdc4sJBySj5kWN?p=preview
Heroes Link๋ฅผ ํด๋ฆญํ๊ณ ํธ์งํ ์์
์ค ํ๋๋ฅผ ์ ํํ๋ฉด ์ค๋ฅ๊ฐ ํ์๋ฉ๋๋ค.
app.component.ts
๋ฐ hero.service.ts
์ ๋ณ๊ฒฝ ์ฌํญ์ ํ์ธํ์ธ์.
@vicb๋ , ์ ๋ฐ์ดํธํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ์ด๋ค ์กฐ์น๋ฅผ ์ทจํ๋์ง ์๋ ค์ฃผ์ค ์ ์๋์? ๋ค์ ๋ฆด๋ฆฌ์ค์์ ์ด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋๋ค๋ ๋ง์์ด์ ๊ฐ์?
๋๋ฅผ ์ํด ์ผํ ๋ ๋ค๋ฅธ ๊ฐ๋จํ ๋์ ์๋ฃจ์
์ ๊ฐ์ ๊ด์ฐฐ ๊ฐ๋ฅํ ๊ฐ์ผ๋ก ๋ฐํํ๊ณ ๋ฐฉ์ถ ๊ฐ์ 10ms ์ง์ฐ์ํค๋ ๊ฒ์
๋๋ค. ์ ๊ฒฝ์ฐ์๋ ์คํผ๋ ๊ฐ์์ ์์ธ๊ฐ ๋ฐ์ํ์ต๋๋ค.
<app-spinner *ngIf="spinner"></app-spinner>
this.eventService.toggleSpinnerAnnounced$.subscribe(
(show: boolean) => this.spinner = show
);
์ด๊ฒ์ ๋๋ฅผ ์ํด ์ผํ์ต๋๋ค :
private spinner = new Subject<boolean>();
toggleSpinnerAnnounced$ = this.spinner.asObservable().delay(10); // This delay() is important
announceSpinnerToggle(show: boolean) {
this.spinner.next(show);
}
์ง์ฐ์ ์ฌ์ฉํ๊ณ ์๊ณ ๊ด์ฐฐ ๊ฐ๋ฅํ ๊ฒ๊ณผ ๊ด๋ จ์ด ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋น์ ์๊ฒ ํจ๊ณผ์ ์ด์์ต๋๋ค.
stettimeout์ ์ฌ์ฉํ ๋๋ ๋์ผํ ๋์์ ํ๊ฒ ๋ฉ๋๋ค.
@Jarvens ๋ถ์ ์ ํ ์ฅ์์ ์ด ๋๊ธ์ ๊ฒ์ํ๋ ๊ฒ์ ์ค๋จํ์ญ์์ค.
GitHub ๋ฌธ์ ๋ ๋ฒ๊ทธ ๋ณด๊ณ ์ ๋ฐ ๊ธฐ๋ฅ ์์ฒญ์ ์ํ ๊ฒ์
๋๋ค.
์ง์ ์ง๋ฌธ์ ๋ํด์๋ CONTRIBUTING - ์ง๋ฌธ์ด๋ ๋ฌธ์ ๊ฐ ์์ต๋๊น?์ ๋์ด๋ ๊ฒ๊ณผ ๊ฐ์ ๋ค๋ฅธ ์ฑ๋์ ์ฌ์ฉํ์ญ์์ค
๊ทํ์ ์๊ฒฌ์ ๋ฌธ์ ๋ฅผ ์ง๋จํ๊ธฐ์ ์ถฉ๋ถํ ์ ๋ณด๋ฅผ ์ ๊ณตํ์ง ์์ต๋๋ค.
์ฐธ๊ณ : ํฌ๋กฌ ํ์ฅ ng-inspector for AngularJS
๋๋ฌธ์ ์ด ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค(batarang ๋์ angular 1 ํ์ฅ).
์ด๊ฑด ๋ฏธ์ณค์ด! ์ ์ฒด ์ค๋ ๋๋ฅผ ์ฝ์ ํ ๊ฐ๋ฐ ๋ชจ๋์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๊ฒ์ @KarlGustav-unimicro๊ฐ ๋งํ ๋๋ก AngularJS์ ๋ํ ng-inspector๋ฅผ ๋นํ์ฑํํ๋ ๊ฒ์ด์์ต๋๋ค.
ChangeDetectorRef.detectChanges()
๋ ์ ์๊ฒ ํจ๊ณผ๊ฐ ์์์ง๋ง ์ ๋ง ํดํน๋ ๋๋์ด์์ต๋๋ค.
@pkozlowski-opensource,
์
๋ ฅ ์ค ํ๋๊ฐ ๋ณ๊ฒฝ๋ ๋ indicatorStyle()
๊ฐ ํธ์ถ๋๋ ์ด์ ๋ฅผ ์ฌ์ ํ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
๋ ์ค๋ช
ํด์ค ์ ์๋?
์์ ๊ตฌ์ฑ ์์์ ChangeDetectionStrategy.OnPush
๋ฅผ ์ค์ ํ์ง ์๊ณ _progress-bar component_์์ ngDoCheck
๋ฅผ ๊ตฌํํ๋ฉด
ngDoCheck
์คํ์ด ๋ ๋ฒ์ด๋ผ๋ ๊ฒ์ ์์์ต๋๋ค.
์ฒซ ๋ฒ์งธ๊ฐ ์คํ๋๋ ์ด์ ๋ฅผ ์๊ณ ์์ต๋๋ค.
ํ์ง๋ง ๋ ๋ฒ์งธ ngDoCheck
๋ํด ์ ๋ง ํผ๋ ์ค๋ฌ์ ์ต๋๋ค ...
@๋ฆฌํฐ์
๋๋ ์ฌ์ ํ ์ ๋ ฅ ์ค ํ๋๊ฐ ๋ณ๊ฒฝ๋ ๋ indicatorStyle()์ด ํธ์ถ๋๋ ์ด์ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
๋ ์ค๋ช ํด์ค ์ ์๋?
indicatorStyle()
๋ ๋ณด๊ธฐ์์ [ngStyle]
์ ๋ฐ์ธ๋ฉ๋๋ฏ๋ก ๋ณ๊ฒฝ ๊ฐ์ง๊ธฐ๊ฐ ์คํ๋ ๋ ํญ์ ํธ์ถ๋ฉ๋๋ค. ์ด๊ฒ์ ์
๋ ฅ์ด ์ค์ ๋ก ๋ณ๊ฒฝ๋์๋์ง ์ฌ๋ถ์ ๊ด๊ณ์์ด ๋ฐ์ํฉ๋๋ค.
ngDoCheck๊ฐ ๋ ๋ฒ ์คํ๋์๋ค๋ ๊ฒ์ ์์์ต๋๋ค.
์ฒซ ๋ฒ์งธ๊ฐ ์คํ๋๋ ์ด์ ๋ฅผ ์๊ณ ์์ต๋๋ค.
ํ์ง๋ง ๋ ๋ฒ์งธ ngDoCheck์ ๋ํด ์ ๋ง ํผ๋ ์ค๋ฝ์ต๋๋ค ...
์ด๊ฒ์ ์ด ์ค๋ ๋์ ์๋ถ๋ถ์์ ์ธ๊ธํ๋ฏ์ด ๋ณ๊ฒฝ ๊ฐ์ง๊ฐ ํญ์ ๊ฐ๋ฐ ๋ชจ๋์์ ๋ ๋ฒ ์คํ๋๊ธฐ ๋๋ฌธ์ผ ์ ์์ต๋๋ค. ์ด๋ ํ๋ก๋์ ์์ ์ด๋ ค์ด ๋ฒ๊ทธ๋ฅผ ์ ๋ฐํ ์ ์๋ ๋ณ๊ฒฝ ๊ฐ์ง ์ค์ ๋ฐ์ธ๋ฉ์ ๋ณ๊ฒฝํ๋ ์ฝ๋๊ฐ ์๋์ง ํ์ธํ๊ธฐ ์ํด ์ํํฉ๋๋ค.
"companionHeight"์ ๋ฐ์ธ๋ฉ๋ <img>์ ๋์ด๋ฅผ ์ ์ดํ๊ธฐ ์ํด ๋์ <ul> ๋ธ๋ก์ ๋์ด๋ฅผ ์ํ์ต๋๋ค.
๋๋ฌด ์ฌ์ ํฉ๋๋ค ... ๊ทธ๋ฌ๋ ๋ค์ ์ Observable์ ์ฌ์ฉํ์ฌ
<ul class="title-list-ul" #listul (window:resize)="setCompanionHeight(listul)">
<img class="title-list-companion-img" [src]="getCompanionImageURL()" [height]="companionHeight"/>
import { Component, OnInit, AfterViewChecked, ElementRef } from '@angular/core'; // redacted
import { Observable } from 'rxjs';
@Component({
selector: 'resume-title-list',
templateUrl: './title-list.component.html',
styleUrls: ['./title-list.component.scss']
})
export class TitleListComponent implements OnInit, AfterViewChecked {
private error: Object;
private companionHeight: number = 0;
private companionHeightLast: number = 0;
// Lots of irrelevant stuff like ngInit redacted for simplicity.
constructor(private elementRef: ElementRef) { } // redacted, mine is more complicated.
setCompanionHeight(listElement: any) {
let clientRect = listElement.getBoundingClientRect();
if (clientRect) {
this.companionHeight = clientRect["height"];
}
}
// window::resize only happens when the window is resized: This is an initialization
// function that sets the initial size of the image... Without it the image height is
// initially zero and the image is not shown.
// The height was not correct in ngAfterViewInit, so I used ngAfterViewChecked instead.
ngAfterViewChecked() {
let ularray = this.elementRef.nativeElement.getElementsByClassName("title-list-ul");
if (ularray && ularray.length > 0) {
let h = ularray[0].getBoundingClientRect().height;
if (h && h != this.companionHeightLast) {
this.companionHeightLast = h;
Observable
.of(h)
.delay(10)
.subscribe(h => this.companionHeight = h,
error => this.error = error);
}
}
}
}
๋ง๊ฐ๋ ๋ฌธ์ ์ ๋ํ ๋๊ธ์ Angular ํ ๊ตฌ์ฑ์์ด ์ฝ์ง ๋ชปํ ์ ์์ต๋๋ค.
์ด๋ฌํ ์ฑ๋ ์ค ํ๋์ ์ง๋ฌธ์ ๊ฒ์ํ๋ ๊ฒ์ ์ด๋ป์ต๋๊น? CONTRIBUTING - ์ง๋ฌธ์ด๋ ๋ฌธ์ ๊ฐ ์์ต๋๊น? Plunker๋ก ์ฌ์์ฐํ์๊ฒ ์ต๋๊น?
๋๋ ๊ฐ์ ๋ฌธ์ ๊ฐ ์์๋ค :
<div *ngIf="isLoading">
<app-some-viewchild></app-some-viewchild>
</div>
๋์ [hidden]์ ์ฌ์ฉํ์ญ์์ค. *ngIf ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ญ์์ค.
์ด ๋ฌธ์ ๋ ๋ง๋ฌ์ต๋๋ค. ๋ง์ง๋ง์ผ๋ก ๊ธฐ๋ณธ ์์ ๊ฐ์ฒด๊ฐ ngModle ๊ฐ์ฒด์ ๋์ผํ๋ค๋ ๊ฒ์ ์์์ต๋๋ค.
@Component
๋ฐ์ฝ๋ ์ดํฐ์์ changeDetection: ChangeDetectionStrategy.OnPush
๋ฅผ ์ค์ ํ๋ฉด ํด๊ฒฐ๋์์ต๋๋ค.
@elvismercado ๋๋ถ์ 2.1.1์์ ๋ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค!
๋ถ๋ชจ ํ ํ๋ฆฟ์ด ์ ๋ฌํ ๊ฐ์ ์์กดํ๋ ์์ ๊ตฌ์ฑ ์์๊ฐ ์์๊ณ ๋ถ๋ชจ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด ์์ ํ ํ๋ฆฟ์ด ์ด ์์ธ๋ฅผ throwํฉ๋๋ค. ํ์ ๊ตฌ์ฑ ์์์ ์ ์์ ์ถ๊ฐํ๋ฉด ๋ณ๊ฒฝ๋ ๊ฐ์ด ํ์ ๊ตฌ์ฑ ์์์ ํธ์๋ ๋๊น์ง ๋ณ๊ฒฝ ๊ฐ์ง๊ฐ ์คํ๋์ง ์์ ๊ฐ์ง๊ฐ ์กฐ๊ธฐ์ ์คํ๋๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์๋ค๊ณ ๊ฐ์ ํฉ๋๊น?
ํฌ์ปค์ค๊ฐ ์๋ ์
๋ ฅ์ด ์๊ณ DOM์์ ์ ๊ฑฐํ๋ฉด(ngIf ์กฐ๊ฑด) "ํ์ธ๋ ํ ํํ์์ด ๋ณ๊ฒฝ๋์์ต๋๋ค" ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค(์
๋ ฅ์ ์ฐ๊ฒฐ๋ ์์ ๊ทธ๋ฃน์ด ์๋ ๊ฒฝ์ฐ์๋ง).
๋ค์์ ๋ฌธ์ ๊ฐ ์๋ ํ๋ฐ์ปค์
๋๋ค.
https://plnkr.co/edit/dooRvC1gY1WEcaNdshoP?p=preview
๊ฐ์ฌ ํด์!
๊ทธ๋์ ์ฌ๊ธฐ์ ํด๊ฒฐ์ฑ ์ ๋ฌด์์ ๋๊น?
ngOnInit์์ ์ ๋ ฅ ๊ฐ์ ๋ณ๊ฒฝํ๋ฉด ์ด๋ฅผ ํธ๋ฆฌ๊ฑฐํฉ๋๋ค.
@coli
๊ทธ๋ฅ ๊ฐ์ธ
setTimeout(()=>{
///your code here
}, 1);
์ฌ์ฉ์๊ฐ ๊ธฐ์กด ์ํฐํฐ๋ฅผ ํธ์งํ๋ ค๊ณ ํ ๋ ๋ฏธ๋ฆฌ ๋ก๋ํด์ผ ํ๋ ํ์ ๊ตฌ์ฑ ์์์ ์กฐํฉ์ด ์์ต๋๋ค.
์์ @drewlio ๊ฒ์๋ฌผ์ ์ฌ์ฉํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๋๊น์ง ๋ช ์๊ฐ ๋์ ์ด ๋ฌธ์ ๋ก ์ด๋ ค์์
_changeDetectionRef ์ฃผ์ :
constructor(
private _changeDetectionRef: ChangeDetectorRef) {
}
๊ทธ๋ฆฌ๊ณ ๋ณ๊ฒฝ ํธ์ถ์ ์ํํ ์งํ ๋ณ๊ฒฝ์ ๊ฐ์งํฉ๋๋ค.
์ด๊ฒ์ ๋๋ฅผ ์ํด ํธ๋ฆญ์ํ์ต๋๋ค.
setSizeFromCtrl() {
console.log("setSizeFromCtrl");
if (this.sizeFromList && this.tradeProfile && this.tradeProfile.SizeFrom && this.sizeFromCtrl) {
this.sizeFromCtrl.select(String(this.tradeProfile.SizeFrom));
this._changeDetectionRef.detectChanges();
console.log("setSizeFromCtrl DONE");
}
}
setCentreTypeCtrl() {
console.log("setCentreTypeCtrl");
if (this.centreTypeList && this.tradeProfile && this.tradeProfile.centreTypeList && this.centreTypeCtrl) {
for (let i of this.tradeProfile.centreTypeList) {
this.centreTypeCtrl.select(i.value);
}
this._changeDetectionRef.detectChanges();
console.log("centreTypeCtrl DONE");
}
}
์ด ๋์ผํ ๋ฌธ์ ๊ฐ ์์์ง๋ง ๋ค๋ฅธ(์ ์ฌํ?) ์์ธ๊ณผ ๋ค๋ฅธ ์๋ฃจ์ ์ด ์์์ ์ ์ํ์ญ์์ค.
ngOnInit()
์ฌ๋ฌ ๊ตฌ์ฑ ์์์ ๊ฑธ์ณ ์ค์ฒฉ๋๊ณ ๊ตฌ์ถ๋ ๋ฐ์ํ ๋ชจ๋ธ์ด ์์ต๋๋ค. ์ด๋ฌํ ์์ ์ค ์ผ๋ถ๋ ํ
ํ๋ฆฟ์์ ngIf
๋ก ์ ํ ์์ต๋๋ค.ngOnInit()
์์๋ ์ฝํ์ง๊ณ theModelForm.patchValue(data)
๋ก ์ ์ฉ๋๊ณ ์์์ต๋๋ค.ngOnInit()
์์ ํผ์ด ์์ฑ๋์ด ํ์ฅ๋ ๋๊น์ง ์คํ๋์ง ์์๊ธฐ ๋๋ฌธ์ DOM์ด ๋น๋๋์ง ์์๋ค๋ ์ฌ์ค๊ณผ ๊ด๋ จ์ด ์์ต๋๋ค. patchValue()
๋ฅผ ๊บผ๋ด๋ฉด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์์ต๋๋ค.patchValue()
์คํ this._changeDetectionRef.detectChanges();
. ๊ทธ๋ฆฌ๊ณ ngIf
๋ฅผ [hidden]
๋ก ๋ณ๊ฒฝํ์ฌ ํผ๊ณผ DOM์ด ์์ ํ ๋น๋๋๋๋ก ํฉ๋๋ค. ์ด๊ฒ์ ๋จ์ ์ ์์ ํ ํํ์ ๊ด๋ จ DOM์ด ์์ฑ๋๊ธฐ ๋๋ฌธ์ ์๊ฐ๊ณผ ๋ฉ๋ชจ๋ฆฌ ๋น์ฉ์ด ๋ ๋ค๋ ๊ฒ์
๋๋ค.patchValue()
(๋๋ ๋ฐ์ดํฐ์ ํ๋๊ฐ 1:1์ธ ๊ฒฝ์ฐ setValue()
)๋ฅผ ์ ์ฉํ๋ ๊ฒ์ด๋ฏ๋ก ์์์ด ngOnInit()
์์ ์์ฑ๋ ๋๋ง ๋ฐ์ํฉ๋๋ค. .์์ง ๋ณ๊ฒฝ ์ฌํญ์ ์ปค๋ฐํ์ง ์์์ต๋๋ค(22/3/17).
๊ทธ๋์ ์ ๋ ์ด ๊ฒฐ์ ์ด ๋ชจ๋ ์ฌ๋์ ๊ตฌํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
๊ทธ๋ฌ๋ ๋์๊ฒ ์ฃผ์ด์ง ์ค๋ฅ์ ๋ฐ์์ ํด๋์ค์ ์ ์์ ์์ฑ๊ณผ ํจ๊ป ๋ฐ์ํ์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ *ngFor๋ฅผ ํตํด ์ถ๋ ฅ๋๋ ๋ฐฐ์ด์ ์ถ๊ฐํฉ๋๋ค.
ํ
ํ๋ฆฟ์ ๊ธฐ๋ณธ ๊ฐ(0, ๋น ์ค)์ ํ์ํ๋ ๋ฐ ํ์ํ ํ๋๋ฅผ ์ฑ์ฐ๋ ์์ฑ์๋ฅผ ํด๋์ค์ ์ถ๊ฐํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค.
export class Task {
task_id: number;
....
constructor() {
this.task_name = '';
this.task_desc = '';
this.task_percent = 0;
addNewTask():void{
let newTask = new Task();
this.tasksList.push(newTask);
}
task_name & task_desc & task_percent ํ ํ๋ฆฟ์ ํ์ํ๊ณ ์์ต๋๋ค. ๋์ด๋ ํ๋ ์ค ํ๋ ์ด์์ด ์์ฑ์์์ ์ด๊ธฐํ๋์ง ์์ ๊ฒฝ์ฐ ๋น์ทํ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
+1
AerisG222 ์๋ฃจ์ ์์
constructor(private _changeDetectionRef : ChangeDetectorRef) { }
ngAfterViewInit() : void {
// your code
this._changeDetectionRef.detectChanges();
}
this._changeDetectionRef.detectChanges()๊ฐ ์๋ํ์ง๋ง ์ ๊ฒฝ์ฐ์๋ ๋ค๋ฅธ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. setTimeout() ํจ์ ์์ ์ฝ๋๋ฅผ ๋ํํ๋ฉด ํด๊ฒฐ๋ฉ๋๋ค.
@GuofuHuang ๊ทธ๋ ๊ฒํ๋ ๊ฒ์ ๋ฌธ์ ๋ฅผ ์์ ํ์ง ์๋ ๋ฌธ์ ๋ฅผ ํผํ๋ ๋ฐฉ๋ฒ์ผ๋ก ๋๋๋ก ๋ฌดํํ ๋ณ๊ฒฝ ๊ฐ์ง ์ฃผ๊ธฐ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
@Toxicable ์ฃ์กํฉ๋๋ค. ์๋ง ์ ๊ฐ ๋ช ํํ ํ์ง ์์์ ๊ฒ์ ๋๋ค. ์ ๋ ์ด๊ฒ์ ์ฌ์ฉํ์ง ์์ ๊ฒ์ ๋๋ค._changeDetectionRef.detectChanges(); ๋์ setTimeout() ์์ ์์ค ์ฝ๋๋ฅผ ๋ํํฉ๋๋ค.
@GuofuHuang setTimeout
์์ ๋ฌด์์ ๋ฃ์ด๋ CD๊ฐ ๋ฐ์ํ๊ณ ์๋ช
์ฃผ๊ธฐ ํํฌ์์ ์คํ ์ค์ธ ๊ฒฝ์ฐ ๋ฌดํ CD ์ฃผ๊ธฐ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ํด๊ฒฐ์ฑ
์ CD๋ฅผ ์คํํ๋ ๋์ CD๋ฅผ ์ ๋ฐํ๋ ๋ณ๊ฒฝ์ ํ์ง ์๋ ๊ฒ์
๋๋ค.
@Toxicable 0์ผ๋ก ์ค์ ํด๋?
@GuofuHuang 0์ผ๋ก ์ค์ ํ๋ฉด CD๊ฐ ๋ฐ์ํ๋ฉด ์
@Toxicable ๋๋์ด ๋งํฌ๋ฅผ ์ฐพ์์ต๋๋ค. http://stackoverflow.com/questions/779379/why-is-settimeoutfn-0-sometimes-useful , setTimeout 0์ C์ pause/yield์ ๊ฐ์ ๊ฒ์ด๋ผ๊ณ ๋งํฉ๋๋ค. ๊ทธ๊ฒ์ด ์ด๋ค CD๋ฅผ ์ผ์ผํฌ์ง ๋ชจ๋ฅด์ง๋ง ์ง๊ธ์ ๋ด์์ ์๋ฒฝํ๊ฒ ์๋ํฉ๋๋ค. ์ด ์๋ฃจ์ ์ด ์๋๋ผ๋ฉด ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๋ ๋์ ์๋ฃจ์ ์ด ์์ต๋๊น?
@GuofuHuang ์ผ์ ์ค์ง/์์ต๋ฅ ์ด C์์ ๋ฌด์์ ํ๋์ง ๋ชจ๋ฅด์ง๋ง JS์์๋ ์ด๋ฒคํธ ๋๊ธฐ์ด์ ๋์ ์ฝ๋ฐฑ์ ๋ฐฐ์นํฉ๋๋ค. ๋ด ์๋ฃจ์ ์ ์์ ๊ฐ์ต๋๋ค. ์๋ฃจ์ ์ CD ์คํ ์ค์ CD๋ฅผ ์ ๋ฐํ๋ ๋ณ๊ฒฝ ์ฌํญ์ด ์๋๋๋ค.
settimeout์ด ํด๊ฒฐ์ฑ
์
๋๋ค
ms ๋งค๊ฐ ๋ณ์๋ฅผ ์ง์ ํ ํ์๊ฐ ์์ผ๋ฉฐ ํ ํฑ์ ๊ธฐ๋ค๋ฆฝ๋๋ค.
@zigzag95 @GuofuHuang setTimeout
์ด ์๋ฃจ์
์ด ์๋ ์ด์ ๋ ์ด ์๋ฅผ ์ฐธ์กฐํ์ธ์.
https://plnkr.co/edit/dv8K9EvVQLG59Gxsl3oI?p=preview
@Toxicable ๊ฐ์ฌํ์ง๋ง ์ ๊ฒฝ์ฐ๋ ์ด๊ฒ๊ณผ ๋งค์ฐ ๋ค๋ฅด๋ฉฐ ๋ฌดํ ๋ฃจํ๊ฐ ๋ณด์ด์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ์ ํ์คํ ๋ด๊ฐ ๊ฐ๋๋ฅผ ๋ ์ ์ดํดํ๋ ๋ฐ ๋์์ด ๋๋ ์ข์ ์์ ๋๋ค.
@GuofuHuang ์ค์ ๋ก ํ ๋ฒ๋ง ํธ์ถ๋๋ ngAfterViewInit
์์ ์ํํ๊ธฐ ๋๋ฌธ์ ๊ทํ์ ๊ฒฝ์ฐ์๋ ๋ฐ์ํ์ง ์์ต๋๋ค. ๋ด ์์ ์ ์ด ๋ฐฉ๋ฒ์ผ๋ก ๋ฌดํ ๋ฃจํ๋ฅผ ์ผ์ผํฌ ์ ์์ผ๋ฏ๋ก ์ฌ์ฉํ๋ ๊ฒ์ด ์ํํ๋ค๋ ๊ฒ์
๋๋ค. ๊ทธ๊ฒ์ด plunkr๊ฐ ๋ณด์ฌ์ฃผ๋ ๊ฒ์
๋๋ค.
@moutono ๋น์ ์ ํธ๋ฆญ์ด ์ ๋ฅผ ๋์์ต๋๋ค! ๊ฐ์ฌํฉ๋๋ค ๐
๋ฌธ์ ๋ ๋ณ๊ฒฝ ๊ฐ์ง๋ฅผ ํธ๋ฆฌ๊ฑฐํ๋ ๊ฒ์ด๋ฏ๋ก ngZone ์์ญ์ด ํจ์น๋ ์ฝ์ํ๊ธฐ ๋๋ฌธ์ ์ฝ์์ ํด๊ฒฐํ๋ ๊ฒ๋ ํจ๊ณผ๊ฐ ์์ ์ ์์ต๋๋ค. ์ด๊ฒ์ ๋๋ฅผ ์ํด ์ผํ์ต๋๋ค.
ngAfterViewInit() {
Promise.resolve().then(() => your_code_here);
}
์, setTimeout์ด ์๋ํ์ง๋ง ๊ทธ ์์ ์ด ๋ง์์ ๋ค์ง ์์์ต๋๋ค. ์ ๊ฒฝ์ฐ์๋ EventEmitter์ ๊ฐ์ ๋ณ๊ฒฝํ๊ธฐ ๋๋ฌธ์ ๋ฐ์ํ์ต๋๋ค.
ํด๊ฒฐ์ฑ
์ ๋ณํ์๋ค
private generalSubscriber: EventEmitter<any> = new EventEmitter<any>();
์๊ฒ
private generalSubscriber: EventEmitter<any> = new EventEmitter<any>(true);
์ด์ํ์ง?
๊ทธ ์ฌ์ค์ ์ด๋ฒคํธ ์ด๋ฏธํฐ๊ฐ ๋น๋๊ธฐ์ ์ด๋ผ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
https://angular.io/docs/ts/latest/api/core/index/EventEmitter-class.html
์ด๊ฒ์ ๋ํ ํด๊ฒฐ์ฑ ์ด ์์ต๋๊น? ํ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
๋งค๋ฒ ์บ์๋ฅผ ์ง์์ผ ํฉ๋๋ค
์ ๊ฒฝ์ฐ์๋ ์ด๋ฏธ์ง ๋ก๋ ์ ์ด๋ฏธ์ง ์คํ
์ ๊ต์ฒดํ๊ณ ์์๋๋ฐ setTimeout
์ ๋ฃ์ด์ผ ํ์ต๋๋ค.
@intergleam @ wasa4587 @ caroso1222 @tandu @ AerisG222 @ ๊ทธ๋ฆฐ ๋ฌด์ด @robwormald @ svi3c @ pkozlowski - ์คํ ์์ค @pcroc @zoechi @stefankoru @bennadel @bryanforbes @Necroskillz @drewlio @ElsewhereGames @zoechi @ user414 @ ์ ์ ์จ์ค
๊ฐ๋ฐํ๋ ๋์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค. ํ๋ก๋์ ์๋ฒ์์ ์ ๋๋ก ์๋ํฉ๋๋ค.
@smartHasmukh ๊ฐ๋ฐ ๋ชจ๋ ์ ์ฉ ์ค๋ฅ์ด๋ฏ๋ก ๋๋ผ์ด ์ผ์ด ์๋๋๋ค.
๊ทธ๋๋ ๊ณ ์ณ์ผ ํฉ๋๋ค.
์ด ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ํ ๋ฐฉํฅ ๋ฐ์ดํฐ ํ๋ฆ์ด ์ค๋จ๋ ๊ฐ๋ฅ์ฑ์ด ํฝ๋๋ค. ํ์ ์ ์๋ ํ ๊ตฌ์ฑ ์์์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ๊ณผ ๊ฐ์ ์ ์์ต๋๋ค. ์์์ ์๋ช
์ฃผ๊ธฐ ํํฌ์์ ๋ถ๋ชจ์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ๊ณผ ๊ฐ์ ๊ฒ์ผ ์ ์์ต๋๋ค.
์ด ์์ธ๊ฐ ๋ฐ์ํ ๊ฒ์ ์ค๋ฅ๊ฐ ์๋์ง๋ง ๊ฐ๋ฐ์๊ฐ ํ ๋ฐฉํฅ ๋ฐ์ดํฐ ํ๋ฆ ๊ณ์ฝ์ด ์ด๋ค ์์ผ๋ก๋ ๊นจ์ก๋ค๋ ๊ฒ์ ์ดํดํ๋ ๋์ฐ๋ฏธ์
๋๋ค. ์ด๊ฒ์ด ํ๋ก๋์
์์ ์๋ํ๋ค๋ ์ฌ์ค์ ์ฐ์ฐํ ๋ฐ์ํ ๊ฒ์ด๋ฏ๋ก ๋ถ๋ชจ-์์ ํต์ ์์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๋ ๋ฐฉ๋ฒ์ ๊ฒํ ํ๊ณ ๊ฐ๋ฐ ๋ชจ๋์์ ์์ ํด์ผ ํฉ๋๋ค.
@smartHasmukh ์ ๋ ์ด๊ฒ ๋ถํธํ์ต๋๋ค. ์๋ฅผ ๋ค์ด ํ์ ์ด๋ฒคํธ์ ์ฐ๊ฒฐํ๊ณ ๋ก๋๋ฅผ ํ์ํ๊ธฐ ์ํด ๊ธฐ๋ณธ ๊ตฌ์ฑ ์์์ ์ด๋ฒคํธ๋ฅผ ์ถ๊ฐ๋ก ๋ด๋ณด๋ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ ๊ตฌ์ฑ ์์์์ ์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ํ(๋ฐ๋ผ์ ๊ตฌ๋ ๋ด์์) ํด๋น ๋ก๋๋ฅผ ์จ๊น๋๋ค. ๊ด์ฐฎ์. ๊ทธ๋ฌ๋ ํ ๊ตฌ์ฑ ์์์์ "์ ์ " ์์ค์์ ์ผ๋ถ ๋ฐ์ดํฐ๋ง ์ป์๊ณ ๊ฑฐ๊ธฐ์๋ ๊ด์ฐฐํ ์ ์์์ผ๋ฏ๋ก ngOnInit๋ฅผ ์ฌ์ฉํ์ฌ ๊ธฐ๋ณธ ๊ตฌ์ฑ ์์์ ๋ก๋๋ฅผ ์จ๊ธฐ๋๋ก ์ง์ํ๋ ค๊ณ ํ์ต๋๋ค. ๊ทธ๋ฌ๋ฉด ๋น์ฐํ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค.
๋ด ๊ฒฝ์ฐ๋ ๋จ์ํด์ผ ํ์ง๋ง ์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ์ด ์๋๋๋ค. ๋๋ ๊ทธ ๊ตฌ์ฑ ์์์ ๋ํด ์ฒ์๋ถํฐ ๋ก๋๋ฅผ ํ์ํ์ง ์๊ธฐ๋ก ๊ฒฐ์ ํด์ผ ํ์ต๋๋ค. , ๊ตฌ์ฑ ์์ ์์ค ๋์ . ๋๋ ๋ชป์๊ธด ์์ ์ ํ๋์ ํน์ ๊ฒฝ์ฐ๋ฅผ setTimeout()์ ๋ํํ๋ ๊ฒ์ ๋๋ค. ์ด๊ธฐ ์ ๊ทผ ๋ฐฉ์์ด ์ณ์ง ์์๊ธฐ ๋๋ฌธ์ ๋๋ค.
TL/DR:
_setTimeout()_ ๋ชป์๊ธด ์์ (๊ทธ ์๊ฐ์ _์ฌํ๊ฒ๋ ์ ํํ์ง๋ง ๋ค์ ๋งํ์ง๋ง, ์ด๊ฒ์ ๋งค์ฐ ๊ฐ๋จํ ์๋๋ฆฌ์ค์ด๊ณ ๋ฌด์์ธ์ง ์๊ณ ์์ต๋๋ค ๊ณ์ ์งํ ์ค์
๋๋ค. ๊ทธ๋ฌ๋ ํฅํ ๋ฆด๋ฆฌ์ค์์ ์ด๋ ์์ ์์ ๋ณ๊ฒฝํด์ผ ํ ์๋ ์์ต๋๋ค.
ํน์ ์ฌ๋ก์ ๋ํด StackOverflow ๋ฅผ ์๋ํ๊ณ ์์ธํ ๋ด์ฉ์ ์ ๊ณตํ ์ ์์ต๋๋ค. ๋ฐฉ๋ฒ์ด ์์ด์ผ ํฉ๋๋ค.
๋ฌผ๋ก ๊ฐ์ฌํฉ๋๋ค @MrCroft @tytskyi ๊ทธ๋ฆฌ๊ณ ์ ๊ฐ ํ ๊ฒ์ ๋๋ค Mr. @zoechi ๊ทธ๋ฆฌ๊ณ ๋๋ ๊ทธ๊ฒ์ด ๋๋ผ์ด ์ผ์ด
@tytskyi
์ด๊ฒ์ด ํ๋ก๋์ ํ๊ฒฝ์์ ์๋ํ๋ค๋ ์ฌ์ค์ ์ฐ์ฐํ ๋ฐ์ํ ๊ฒ์ด๋ฏ๋ก ๊ฒํ ํด์ผ ํฉ๋๋ค.
์๋์, ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์ด ์ค๋ฅ์ ๋ํ ์ ์๋ต์ "์, ์๊ณ ์์ต๋๋ค. ์๋ํ ๊ฒ์ ๋๋ค"์ ๋๋ค. ๋ด ์ฑ์ ๋ง์ ๊ตฌ์ฑ ์์๊ฐ ์ด๊ธฐํ ํ ๋ฐ์ธ๋ฉ๋ ๋ณ์์์ ์ ๊ฐ์ ์์ ํ ํ ๋ฌด์ธ๊ฐ๋ฅผ ๋ก๋ํฉ๋๋ค. ์ด ๋ฌธ์ ๋ Angular์ "์๋ ค์ง ์ถํจ"์ด๋ฉฐ ์๋ฌด๋ ์ ๊ฒฝ ์ฐ์ง ์์ต๋๋ค.
@e-oz ์๋ช ์ฃผ๊ธฐ ํํฌ์์ ๋ถ๋ชจ ๋๋ ํ์ ์ํ์ ์ํฅ์ ๋ฏธ์น๋ ๊ฒฝ์ฐ ํ ๋ฐฉํฅ ๋ฐ์ดํฐ ํ๋ฆ์ด ์ค๋จ๋ฉ๋๋ค. ์์ฉ ํ๋ก๊ทธ๋จ ์ํ๊ฐ ์์ ํ๋์์ ๋ ์ด๋ฌํ ๋ณ๊ฒฝ์ ์ํํด์ผ ํ์ง๋ง ๋ณ๊ฒฝ ๊ฐ์ง ์ค์ด ์๋๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ microtask, setTimeout 0 ๋ฑ์ ํธ๋ฆญ์ด ์์ต๋๋ค.
@tytskyi "ํด์ผ"ํ๋
@e-oz HTTP ์์ฒญ๊ณผ ์ด๋ค ๊ด๋ จ์ด ์์ต๋๊น? HTTP ์์ฒญ ์๋ต์ผ๋ก ์ธํด ๋ณ๊ฒฝ ๊ฐ์ง๊ฐ ๋ฐ์ํ๊ณ "์์ด ๋ณ๊ฒฝ๋์์ต๋๋ค..." ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค.
๋ ๋ง์ ์ ๋ณด๋ฅผ ์ ๊ณตํด ์ฃผ์๊ฒ ์ต๋๊น?
@zoechi ์๊ฐ์ ๋ญ๋นํ ์ด์ ๊ฐ ์์ต๋๋ค. ์๋ฌด๋ ๋ณ๊ฒฝํ์ง ์์ ๊ฒ์ด๋ฉฐ ์์ ์ด ์ข ๋ฃ๋ฉ๋๋ค.
@e-oz ๋ฌธ์ ๋ 1๋
์ ์ ์ข
๋ฃ๋์์ผ๋ฉฐ Angular ํ์ ๋น์์ ์๋นํ ๋ค๋ฅธ ์ฐ์ ์์๋ฅผ ๊ฐ์ก์ต๋๋ค(๋ฆด๋ฆฌ์ค ์ถ์). ๋น์์๋ ์ด ๋ฌธ์ ๊ฐ ์ฐจ๋จ๋์ง ์์์ต๋๋ค.
์ ํจํ ์ฌ๋ก๊ฐ ์๋ค๊ณ ์๊ฐ๋๋ฉด ์ ๋ฌธ์ ๋ฅผ ๋ง๋ค์ด์ผ ํฉ๋๋ค.
@zoechi ๋๋ ๋น์ ์ด ๋ด๊ฐํด์ผ ํ ์ผ์ ๊ฒฐ์ ํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ์ ๋ฌธ์ ๋ฅผ ๋ง๋ค ์ ์์ง๋ง ๊ทธ๋ด ํ์๋ ์์ต๋๋ค. ๋ชจ๋ ์กด๊ฒฝ์ฌ์ผ๋ก ์ธํด ๋๋ "ํด์ผ ํ๋ค"๋ผ๋ ์ด์กฐ๋ฅผ ์ข์ํ์ง ์์ต๋๋ค.
@e-oz ์๊ฒ ์ต๋๋ค. ๊ทํ์ ์๊ฒฌ์ ์ข์ ๊ฐ์ ํ์ถํ๊ธฐ ์ํ ๊ฒ์ผ ๋ฟ์ด๋ฉฐ ์๋ฃจ์ ์ ์ป๋ ๋ฐ ๊ด์ฌ์ด ์์ต๋๋ค. ์ธ๋ฐ์๋ ๋๊ธ๋ก ์ฌ๊ธฐ์์ ๋ค๋ฅธ ์ฌ๋๋ค์ ์๊ฐ์ ๋ญ๋นํ์ง ๋ง์ญ์์ค.
http๋ฅผ ํธ์ถํ๋ ๊ฒฝ์ฐ ๊ตฌ์ฑ ์์์ ๊ฐ์
ํ๊ณ ์ถ๊ฐํ์ญ์์ค.
Promise.resolve().then(() => your_code_here);
๋๋
myObservable.delay(10).subscribe(...)
๋ ๊ฐ์ง ์๋ฃจ์ ์ค ํ๋๊ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค
@vicb ํด๊ฒฐ๋์ง ์์ ๋ฌธ์ ์ข ๋ฃ๋ฅผ ์ค์งํฉ๋๋ค. ์ ์ด๋ฐ ์ง์ํ๋ ?
์ ์ด๋ ์ ์ ํ ์์ ์ ์ ์ํ์ง๋ง ์ด๊ฒ์ ๋ซ๋ ๊ฒ์ ํ์ฉ๋์ง ์์ต๋๋ค.
@diegogarciaa ... ๊ทธ๋ฆฌ๊ณ ์ ํํ ์์ ๋์ง ์์๊ฑฐ๋ ๊ทํ์ ๊ด์ ์์ ์๋ชป๋ ๊ฒ์ ๋ฌด์์ ๋๊น? ๋ํ ^^^ ๋๋ฌด ๊ธธ์ด์ ์ง์ง ํต์ฌ์ ์ฐพ๊ธฐ ํ๋ญ๋๋ค.
@mlc-mlapis ๋ชจ๋ ์กด๊ฒฝ๊ณผ ํจ๊ป, ๋๋ ๋น์ ์ ์ ์๋์ด ์๋๋๋ค. ๋ฌธ์ ๋ฅผ ์ฝ๊ฑฐ๋ ์ดํดํ ์ ์๋ค๋ฉด ๊ท์ฐฎ๊ฒํ์ง ๋ง์ญ์์ค. ๋๋ ๋ชจ๋ ์ฝํ ์ธ ๋ฅผ ์ฝ๋ ๋ฐ ์ค๋ ์๊ฐ์ ๋ณด๋์ต๋๋ค. ๋์ผํ ๊ฒ์ ์ถ์ฒํฉ๋๋ค.
์ต๊ทค๋ฌ ํ(๋ชจ๋ ํ์ ์๋์ง๋ง ์ด ๋ฌธ์ ๋ฅผ ๋ซ๋ ์ฌ๋) ํ๋๋ ๋งค์ฐ ์ง์ทจ์ ์ธ ๊ฒ ๊ฐ์ต๋๋ค. ๋ง์ง ์๊ณ (๋ด ๊ธ์ฌ), ๊ณง ์์ ํ์ง ์์ต๋๋ค.
@diegogarciaa ... ์์ฃผ ์ข์ต๋๋ค. ์์ ๊ฐ์ด ๊ณ์ํ๋ฉด ์ด๋์๋ ํ์๋ฐ์ ๊ฒ์ ๋๋ค.
@mlc-mlapis ๋๋ ์ฌ๋๋ค์ด ์ฝ์ ์ ์๋ ๊ณณ์์ ํ์๋ฐ๊ณ ์ถ์ง ์๊ณ , ์ฝ์ง ๋ง์์ผ ํ ๊ณณ์์ ํ์๋ฆฌ๋ฅผ ํ๋ ค๊ณ ํฉ๋๋ค.
@diegogarciaa ... ๊ทธ๋ฅ ๊ฐ์ธ์ ์ผ๋ก ๋ฌธ์ ๊ฐ ์๋ค๊ณ ์๊ฐํ๋๋ฐ ์ง๊ธ์ ์ฌ์ค์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ํ์ค์ ๋ํ Expression has changed after it was checked ...
์ ๋๋ถ๋ถ์ ๋ฌธ์ ๋ ๋ฒ๊ทธ๊ฐ ์๋๋ผ CD๊ฐ ์ด๋ป๊ฒ ์๋ํ๋์ง ์ ๋๋ก ์ดํดํ์ง ๋ชปํ๋ ๊ฒ์
๋๋ค.
@mlc-mlapis ok... ์ดํดํ์
http://plnkr.co/edit/nm8OkrpZCIp4cvA6TbpO?p=preview
์ด plunk์์ ngAfterViewInit๊ฐ ํธ์ถ๋ ๋ ๋ณ์๊ฐ ๋ฐ์ธ๋ฉ๋๊ณ ๊ฒ์ฌ๋์์์ ์ดํดํ ์ ์์ผ๋ฏ๋ก ์ ๊ฐ์ ์์ ํ๊ณ ์ ๊ฒ์ฌ ๋ผ์ด๋๋ฅผ ํธ๋ฆฌ๊ฑฐํ์ง ์์ผ๋ฉด ์์ธ๊ฐ throw๋ฉ๋๋ค.
๊ทธ๋ฌ๋ ์๋ฅผ ๋ค์ด ๋ณด๊ธฐ ์ปจํ ์ด๋ ์ฐธ์กฐ๊ฐ ์๊ณ ์๋ฅผ ๋ค์ด ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํฉ๋๋ค.
this.service.GetData().subscribe(
์๋ต => this.component.instance.dataModel = ์๋ต
);
dataModel์ด ๋ด html์์ {{ dataModel.Field }}๋ก ์ฌ์ฉ๋๊ณ ์๋ค๊ณ ์๊ฐํ์ญ์์ค.
this.component๋ ํน์ ์ด๋ฒคํธ์์ ๋ก๋๋๋ ๋์ ๊ตฌ์ฑ ์์์ ๋๋ค. ์ด๋ป๊ฒ ์ค๋ฅ๋ฅผ ํผํ ์ ์์ต๋๊น? ๋ณ๊ฒฝ ๊ฐ์ง์ ์๋ช ์ฃผ๊ธฐ ํํฌ ์ ์ ๋ฐ์ดํฐ๋ฅผ ๊ตฌ์ฑ ์์์ ์ ๋ฌํ๋ ์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ์ ๋ฌด์์ ๋๊น?
@diegogarciaa ... ์, ์ด๊ฒ์ ๋น๋๊ธฐ ๋ฐ ๋๊ธฐํ ์์ ์ด ํผํฉ๋์ด ํ๋์ CD์์ ํจ๊ป ๋ง๋๊ณ ๊ฐ๋ฐ ๋ชจ๋์์ ํ์ธ๋๋ ์ผ๋ฐ์ ์ธ ์์ ๋๋ค. https://hackernoon.com/everything-you-need-to-know-about-the-expressionchangedafterithasbeencheckederror-error-e3fd9ce7dbb4 ๊ฒ์๋ฌผ์ ์ค๋ช ์ ๋ฐ๋ณตํ์ง ์์ ๊ฒ์ด๋ฏ๋ก ๋จผ์ ์ฝ์ด๋ณด์ญ์์ค.
๊ทธ๋ฆฌ๊ณ https://hackernoon.com/here-is-how-to-get-viewcontainerref-before-viewchild-query-is-evaluated-f649e51315fb ๋ ์ดํด๋ณด์ญ์์ค
๋ฐ๋ผ์ ์ด ๊ธฐ์ฌ์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ณ๊ฒฝ ๊ฐ์ง ๋ผ์ด๋๋ฅผ ์๋์ผ๋ก ํธ์ถํด์ผ ํ๋ค๊ณ ๋งํฉ๋๋ค...
์์งํ ์ง๊ธ ์ํฉ์ด ๋๋ฌด ์์ํด์.. ์ต๊ทค๋ฌ์ ์ฌ์ํ ๊ฒ์กฐ์ฐจ ๋๋ฌด ์ง๊ฒน๊ณ ์ง๊ฒน๊ณ .. ์จ๋ ๋ชป์ฌ๊ฒ ์ด์. ์ ์ฅ
@diegogarciaa ... ์๋์, ๋ณด์กฐ ์๋ฃจ์
์ผ ๋ฟ์
๋๋ค. promise.then
์ฌ์ฉํ๊ฑฐ๋ setTimeout
...๋ฅผ ์ฌ์ฉํ ์๋ ์์ง๋ง ์ด ๊ฒฝ์ฐ ๊ถ์ฅ๋๋ ์๋ฃจ์
์ ์๋ง๋ ๊ณต์ ์๋น์ค์ผ ๊ฒ์ด๋ฏ๋ก CD ์ฃผ๊ธฐ์ ํด๋น ํ์ธ.
๋๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ฒ ๋๋ ์๊ฐ์ ๋์ ๊ตฌ์ฑ์์์ ์ธ์คํด์ค๋ฅผ ์์ฑํ์ญ์์ค. ๋ฐ๋ผ์ ๊ตฌ๋ ์ ๋์ ๊ตฌ์ฑ ์์ ์ธ์คํด์ค์ ์์ฑ์ ํธ์ถํฉ๋๋ค.
๊ทธ๋ฌ๋ ์ค์ํ ๊ฒ์ -> ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ์ฃผ์ ๋ ผ๋ฆฌ -> ๋จ๋ฐฉํฅ ๋ณ๊ฒฝ์ ํญ์ ์ ์ฒด ํธ๋ฆฌ๋ฅผ ํตํด ์์์ ์๋๋ก ํ๋ฌ์ผ ํ๊ณ ํ CD ์ฌ์ดํด ํ์ ๋จ๋ฐฉํฅ ์์น์ด ์กด์ค๋์๋ค๋ ์ํ์ ํ์ธ์ด ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ด "์ ์ฅ"์ ๊ฐ์ธ์ ์ธ ๊ฒ์ด ์๋ ์์ต๋๋ค ... ๋จ์ง ๋ด ์ข์ ๊ฐ์ ํ ํด๋ด๋ ๊ฒ์ ๋๋ค.
์ง์ ์คํค๋ง๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌ์ฑ ์์๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค. ๊ตฌ์ฑ ์์๋ฅผ ๊ตฌ์ฑ ์์ ๋ณด๊ธฐ ์ฐธ์กฐ์ ๋ก๋ํ๋ ๋์ฐ๋ฏธ๋ฅผ ๊ตฌ์ถํ์ผ๋ฉฐ ์ดํดํ ๋๋ก ๊ตฌ์ฑ ์์๊ฐ ๋ก๋๋ ๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ ์ ์์ด์ผ ํฉ๋๋ค.
protected loadPartialView(viewName: string, target: ViewContainerRef) : ComponentRef<any> {
const factories = Array.from(this.resolver['_factories'].keys());
const factoryClass = <Type<any>>factories.find((x: any) => x.name === viewName);
const factory = this.resolver.resolveComponentFactory(factoryClass);
return target.createComponent(factory);
}
์์ ์์์ ๋ค์๊ณผ ๊ฐ์ด ํ๊ณ ์ถ์ต๋๋ค.
return target.createComponent(factory, dataSource);
์์ฑ์ ์๊ฐ์ ๋ด dataSource๋ฅผ ์ฌ์ฉํ ์ ์๋ ์์น
๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌ์ฑ ์์๋ฅผ ํต๊ณผํ๋ ๋ฐ์ดํฐ ์์ค๋ฅผ ์ฒ๋ฆฌํ๋ redux์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ฐ๋ฆฌ๋ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ์ฃผ์ ๊ฐ๋ฅํ ๊ตฌ์ฑ ์์๋ฅผ ๊ตฌํํ์ฌ ์๋ช ์ฃผ๊ธฐ ํํฌ ์ ์ ๊ฐ์ ธ์ฌ ์ ์๋๋ก ์๊ฐํ๊ณ ์์ต๋๋ค.
๋์๊ณ ๊ฐ๋ฅด์์
๋๋ ๋ฐ์ดํฐ๊ฐ ์ด์ ์ ์ฌ์ฉ ๊ฐ๋ฅํด์ผํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค ... ๋์ ๊ตฌ์ฑ ์์๋ ์ฌ์ ํ @Input()
๋ฐ @Output()
๊ฐ ์๋ ๊ตฌ์ฑ ์์์ด์ง๋ง ๋ฌธ์ ๋ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ ๋์
๋๋ค.
... ๊ตฌ์ฑ ์์๊ฐ ๋ก๋๋ ๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ ์ ์์ด์ผ ํฉ๋๋ค ...
์ง์ฐ ๋ก๋๋ ๋ชจ๋์ ๊ตฌ์ฑ ์์๋ ์ฌ์ฉํด์ผ ํ๋ค๊ณ ๊ฐ์ ํ๋ฏ๋ก ๋ฌธ์์ด ์ด๋ฆ๋ง ์ฌ์ฉํ์ฌ ๊ตฌ์ฑ ์์์ ์ก์ธ์คํ ์ ์๋๋ก ๋ชจ๋์์ ์ง์ ๋งต์ ์ฌ์ฉํฉ๋๋ค.
export default class LazyLoadedModule {
cmps: Map<{}, {}> = new Map();
constructor() {
this.cmps.set('first-component', FirstComponent);
...
}
}
return target.createComponent(factory, dataSource);
์(๋) ๋ฌด์จ ๋ป์ธ๊ฐ์? ์ค์ API๋ createComponent(componentFactory, index, injector, projectableNodes, ngModule)
์ด๊ธฐ ๋๋ฌธ์
๋๋ค.
๊ทธ๋ฆฌ๊ณ ์๋ง๋ ์๋ก์ด @angular/cdk ๋ชจ๋์ด ๋น์ ์๊ฒ ํฅ๋ฏธ๋ก์ธ ๊ฒ์ ๋๋ค. ์ฌ๊ธฐ์์ ์๊ฐํฉ๋๋ค: https://medium.com/@caroso1222/a -first-look-into-the-angular-cdk-67e68807ed9b.
๊ฐ์น๊ฐ ์๊ณ ๋๊ตฐ๊ฐ๋ฅผ ๋์ธ ์ ์๋ค๋ฉด setTimeout
๋ฅผ ์ฌ์ฉํ๋ ๋์ ChangeDetectorRef.detectChanges()
๊ฒ์ด ํจ๊ณผ๊ฐ ์์๊ธฐ ๋๋ฌธ์ ๊ฒฐ๊ตญ NgZone.onStable
ํ๊ณ ๋ด ์ฝ๋๋ฅผ ์คํํ์ต๋๋ค. EventEmitter
์ ํ ๋ฒ ๊ตฌ๋
ํ์ฌ ...
constructor(
private zone: NgZone,
) { }
ngAfterViewInit() {
this.zone.onStable.first().subscribe(() => {
// your code here
});
}
์ด ์์
์ ๊ฒฐ๊ณผ๋ฅผ ์์ ํ ์์ง ๋ชปํ์ง๋ง setTimeout
์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค ์ต์
์ผ ์ ์์ต๋๊น? ๋๊ตฌ๋ ์ง ์ด ๋ฌธ์ ์ ๋ํด ์๊ฒฌ์ด ์์ผ๋ฉด ์ ๋ง ํ์ํฉ๋๋ค!
@AerisG222 ์๋ฃจ์ ์ด ์ ์๊ฒ ํจ๊ณผ์ ์ ๋๋ค.
constructor(private _changeDetectionRef : ChangeDetectorRef) { }
ngAfterViewChecked() : void {
// your code
this._changeDetectionRef.detectChanges();
}
์ด๊ฒ์ html ๊ตฌ์ฑ ์์์ ๋๋ค.
{{ lastData.note[i].date | ๋ ์ง : 'dd.MM.yyyy'}} | {{ lastData.note[i].date | ๋ ์ง: 'HH:mm' }} : #BFL15_200817 | {{ lastData.status.name }} ์์ฑ์: {{lastData.note[i].admin}} ๋ฐฐ์ด์ ๋ฐ์ดํฐ๊ฐ ๋ ์ด์์ธ ๊ฒฝ์ฐ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค. ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
์ด๊ฒ์ ํ์คํ ๋ณต์กํ ๋ฌธ์ ์ด์ง๋ง ์ผ๋ถ ๊ฒฝ์ฐ(ํนํ ContentChild์ ์์ฑ์ ์์ ํ ๋) ๋ ผ๋ฆฌ๋ฅผ ngAfterViewInit() ๋๋ ngOnInit() ๋์ ngAfterContentInit()๋ก ์ด๋ํ์ฌ ํด๊ฒฐํ ์ ์์ต๋๋ค.
๊ฐ๋จํ ๊ฒ๋ค์ด ๊ฐ๋์์ ๊ทธ๋ ๊ฒ ๋ง์ ํผ๋์ ์ผ์ผํฌ ์ ์๋ค๋ ๊ฒ์ ๋๋์ต๋๋ค.
๊ฑฑ์ ํ์ง ๋ง์ธ์, ๋ค๋ฅธ ์ฌ๋๋ค๋ ๋ชจ๋ ๋์น ์ฑ์ต๋๋ค ๐
@jakeNiemiec ์ ๋ฆ๋ฐ์ด ์ง์
, ํธ๋กค, ์๋ฌด๋ Angularjs๋ฅผ ๋ ์ด์ ๊ฒ์ํ์ง ์์ต๋๋ค
https://trends.google.com/trends/explore?date=all&q=Angular%20tutorial ,React%20tutorial
์, ๋ ๋ง์ ์ฌ๋๋ค์ด ํ์ฌ์ ์ผ๋ก "๊ฐ๋ ์์ต์"๋ฅผ Google์ ๊ฒ์ํด์ผ ํ๋ฏ๋ก "ํผ๋"์ ๋ํ ์ด๊ธฐ ์๊ฒฌ์ด ํ์ํฉ๋๋ค.
ํ์ง๋ง ๊ฑฑ์ ํ์ง ๋ง์ธ์. ์ ํํ ์ฌ์ฉ ํต๊ณ๋ npm์์ ํ์ธํ ์ ์์ต๋๋ค. http://www.npmtrends.com/react-vs-@angular/cli -vs-vue-vs-@angular/core
๋ฌธ์ ์ ์๋ง ๋น๊ตํ์ญ์์ค. Angular๊ฐ ๋ ์ข์์ง๋ ๊ฒ์ ๋ณด๊ณ ์ถ์ง๋ง Vue.js๊ฐ ๋จผ ๋ฏธ๋์ ํต๊ณผํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. 3๊ฐ์ง ๋ชจ๋์์ ํ๋ก๊ทธ๋๋ฐํ ์ ๋ Vue๋ฅผ ๊ฐ๋ ๊ฐ๋ฐ์์๊ฒ ๊ฐ๋ ฅํ ์ถ์ฒํฉ๋๋ค. ๊ทธ๊ฒ์ ๋ณด์ผ๋ฌ ํ๋ ์ดํธ๊ฐ ์๋ ๊ฐ์ง ๊ฒ๊ณผ ๊ฐ์ต๋๋ค.
ok ๋๋ต์ด ์๋ฝ๋์์ต๋๋ค. ๋๋ ๊ทธ ํต๊ณ์ ์๋ฒฝํ๊ฒ ๋ง์ต๋๋ค.
์ธ๋์๋ ์ ์ธ๊ณ์ ์ผ๋ก Java๋ณด๋ค PHP๋ฅผ ์ฌ์ฉํ๋ ์ฌ๋๋ค์ด ๋ ๋ง๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋๊ท๋ชจ ์ํฐํ๋ผ์ด์ฆ ์ฑ์ PHP๋ฅผ ์ฌ์ฉํ๋ ์ฌ๋์ ๋ฐ๋ณด๊ฐ ๋ ๊ฒ์ด๋ฏ๋ก ๋๋๋ก ์์ ์ ๋๋๋ฅผ ์ฌ์ฉํด์ผํฉ๋๋ค. ์ถ์ด ๋ ๋์์ง ๊ฒ์
๋๋ค.
@jakeNiemiec ... ์์ฑ๋๋ ๋ฌธ์ ์ 50%๊ฐ ์ค์๋ก ๊ฑฐ๊ธฐ์ ๋ฐฐ์น๋ฉ๋๋ค ... ์ค์ ๋ก ์ง์/์ง์ ๋ฌธ์ ์ด๋ฉฐ ์ ํ ์กด์ฌํด์๋ ์๋ฉ๋๋ค. ์ฌ๋ฏธ๋ ํ์ํ ์ฃผ์ ์ ๋๋ถ๋ถ์ด ๊ณต์ ๋ฌธ์์ ๋งค์ฐ ์ ๋ฌธ์ํ๋์ด ์๊ณ ๋ต๋ณ์ด JavaScript์ ๋ํ ์ง์์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ค๋ ๊ฒ์ ๋๋ค. ํ์ง๋ง ์ฌ๋๋ค์ ๋ฌธ์๋ฅผ ์ถฉ๋ถํ ๊น์ด ์ฝ์ง ์์ต๋๋ค.
@HostBinding ์ ์ด ์ค๋ฅ์ ํผ๋์ค๋ฌ์ด ์์ธ์ด ๋ ์ ์์ต๋๋ค.
@HostBinding('style.background')
์ ๊ฐ์ ๊ตฌ์ฑ ์์์ ๋ํ ๊ฐ๋จํ ๋ฐ์ธ๋ฉ์ ๊ณ ๋ คํ์ญ์์ค.
ํด๋น ์์ฑ์ *parent * ๊ตฌ์ฑ ์์์ ๋ณ๊ฒฝ ๊ฐ์ง์ ์ํด '์์ '๋ ๊ฒ์ฒ๋ผ ํ์ธ๋ฉ๋๋ค. ์ฐ๋ฆฌ์ ๊ด์ ์์ ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ๊ทธ ์์ฑ์ '์์ ํ๋' ์์ ์ปดํฌ๋ํธ๋ก ์๊ฐํ๊ธฐ๋ฅผ ์ํฉ๋๋ค.
์ด ๊ฒฝ์ฐ ๊ฒ์ฌ๋ฅผ ์ํด ๊ตฌ์ฑ ์์๊ฐ ์์ฑ์ ์ ์ธํ๋ ๋ฐฉ๋ฒ์ด ์์ด์ผ ํ๋ ๊ฒ ๊ฐ์ต๋๊น? ์๋๋ฉด ๊ทธ๋ณด๋ค ๋ ๋ณต์กํฉ๋๊น?
์์ ๊ตฌ์ฑ ์์๊ฐ ๋จ์ํ ์์ฒด ๋ฐฐ๊ฒฝ์์ ๋ณ๊ฒฝํ๊ณ ๋ค๋ฅธ ๊ณณ์์๋ ์ ๋ ํ์ง ์๋ ๊ฒฝ์ฐ ์ค๋ฅ๋ฅผ ํผํ๊ธฐ ์ํด ๋ถ๋ชจ ๊ตฌ์ฑ ์์๊ฐ detectChanges
(๋๋ ์์์ ์ถ๊ฐ div๋ฅผ ์ถ๊ฐํด์ผ ํ์ต๋๋ค) .
์์ธํ ์ค๋ช : https://stackoverflow.com/questions/43375532/expressionchangedafterithasbeencheckederror-explained/51662105#51662105
๊ทธ ๋ฐฉ๋ฒ ๋์ ๋ค๋ฅธ ๋ณ๊ฒฝ ๊ฐ์ง ๋ผ์ด๋๋ฅผ ํธ๋ฆฌ๊ฑฐํ๋ ๋ฌด์์ด๋ ํ๋ฉด ๋ฉ๋๋ค. ์ด๋ฒคํธ๋ฅผ ๋ด๋ณด๋ด๋ ๊ฒ์ ๋๋ค. ํ์์์(ng1:-P์ ๋ํ ๋๊ธฐ์ด ํ๋์๋ฐฑ)์ผ๋ก ๋ํํ๋ ๊ฒ์ ์๋ํ๋ ํ ๊ฐ์ง ๋ฐฉ๋ฒ์ด์ง๋ง ng2์์๋ ๋งค์ฐ ์ง์ ๋ถํ๊ฒ ๋๊ปด์ง๋๋ค.
Angular 4์์๋ 4 me <3
์ด ๋ฌธ์ ๋ ํ๋์ด ์์ด ์๋์ผ๋ก ์ ๊ฒผ์ต๋๋ค.
์ ์ฌํ๊ฑฐ๋ ๊ด๋ จ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด ์ ๋ฌธ์ ๋ฅผ ์ ์ถํ์ญ์์ค.
์๋ ๋ํ ์ ๊ธ ์ ์ฑ ์ ๋ํด ์์ธํ ์์๋ณด์ธ์.
_์ด ์์ ์ ๋ด์ ์ํด ์๋์ผ๋ก ์ํ๋์์ต๋๋ค._
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ด๊ฒ์ ๋ฒ๊ทธ๊ฐ ์๋๋ผ ์๋ํ ๋๋ก ์๋ํ๋ ๊ฐ๋ฐ ๋ชจ๋์ ๊ธฐ๋ฅ์ ๋๋ค.
enableProdMode( )
ํธ์ถ - ์ฑ์ ๋ถํธ์คํธ๋ฉํ ๋ ์ ๋ฐ์ดํธ๋ plunk๋ฅผ ์ฐธ์กฐ ํ๋ฉด ์์ธ๊ฐ throw๋์ง ์์ต๋๋ค.์ฆ, ์ ๋นํ ์ด์ ๊ฐ ์์ต๋๋ค. ์ฆ, ๋ชจ๋ ๋ณ๊ฒฝ ๊ฐ์ง ๋ผ์ด๋ ํ dev ๋ชจ๋๋ ์ฆ์ ๋ ๋ฒ์งธ ๋ผ์ด๋๋ฅผ ์ํํ์ฌ ์ฒซ ๋ฒ์งธ ์ข ๋ฃ ์ดํ ๋ฐ์ธ๋ฉ์ด ๋ณ๊ฒฝ๋์ง ์์๋์ง ํ์ธํฉ๋๋ค. ์ด๋ ๋ณ๊ฒฝ์ด ๋ฐ์ํ์์ ๋ํ๋ด๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ณ๊ฒฝ ๊ฐ์ง ์์ฒด์ ์ํด.
๋น์ ์ ์ฟตํ๋ ์๋ฆฌ์, ๋น์ ์ ๋ฐ์ธ๋ฉ ํ
[attr.spinner]=isLoading
๋ฐisLoading
๋ก ํธ์ถ์ ๊ฒฐ๊ณผ๋ก ๋ณ๊ฒฝthis.load()
๋ ๋ฐ์,ngAfterViewInit
๋ฐ์ฌ๋๊ณ , ์ด๋ค ์ด๊ธฐ ๋ณ๊ฒฝ ๊ฐ์ง ์ฐจ๋ก์ ์ผ๋ถ๋ก ๋ฐ์ํฉ๋๋ค. ๊ทธ ์์ฒด๋ก๋ ๋ฌธ์ ๊ฐ ๋์ง ์์ต๋๋ค. ๋ฌธ์ ๋this.load()
๊ฐ ๋ฐ์ธ๋ฉ์ ๋ณ๊ฒฝํ์ง๋ง ์๋ก์ด ๋ณ๊ฒฝ ๊ฐ์ง ๋ผ์ด๋๋ฅผ ํธ๋ฆฌ๊ฑฐํ์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค. ์ฆ, ์ด ๋ฐ์ธ๋ฉ์ ํฅํ ๋ณ๊ฒฝ ๊ฐ์ง ๋ผ์ด๋๊น์ง ์ ๋ฐ์ดํธ๋์ง ์์ต๋๋ค.