Angular: ์˜ˆ์™ธ: ํ™•์ธ ํ›„ ํ‘œํ˜„์‹์ด ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2015๋…„ 12์›” 18์ผ  ยท  147์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: angular/angular

์—ฌ๊ธฐ์„œ ๋ฌด์Šจ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? http://plnkr.co/edit/nm8OkrpZCIp4cvA6TbpO?p=preview

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์ด๊ฒƒ์€ ๋ฒ„๊ทธ๊ฐ€ ์•„๋‹ˆ๋ผ ์˜๋„ํ•œ ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š” ๊ฐœ๋ฐœ ๋ชจ๋“œ์˜ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. enableProdMode( ) ํ˜ธ์ถœ - ์•ฑ์„ ๋ถ€ํŠธ์ŠคํŠธ๋žฉํ•  ๋•Œ ์—…๋ฐ์ดํŠธ๋œ plunk๋ฅผ ์ฐธ์กฐ ํ•˜๋ฉด ์˜ˆ์™ธ๊ฐ€ throw๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ฆ‰, ์ •๋‹นํ•œ ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๋ชจ๋“  ๋ณ€๊ฒฝ ๊ฐ์ง€ ๋ผ์šด๋“œ ํ›„ dev ๋ชจ๋“œ๋Š” ์ฆ‰์‹œ ๋‘ ๋ฒˆ์งธ ๋ผ์šด๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ ์ฒซ ๋ฒˆ์งธ ์ข…๋ฃŒ ์ดํ›„ ๋ฐ”์ธ๋”ฉ์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ–ˆ์Œ์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ ๊ฐ์ง€ ์ž์ฒด์— ์˜ํ•ด.

๋‹น์‹ ์˜ ์ฟตํ•˜๋Š” ์†Œ๋ฆฌ์—, ๋‹น์‹ ์€ ๋ฐ”์ธ๋”ฉ ํ•œ [attr.spinner]=isLoading ๋ฐ isLoading ๋กœ ํ˜ธ์ถœ์˜ ๊ฒฐ๊ณผ๋กœ ๋ณ€๊ฒฝ this.load() ๋•Œ ๋ฐœ์ƒ, ngAfterViewInit ๋ฐœ์‚ฌ๋˜๊ณ , ์–ด๋–ค ์ดˆ๊ธฐ ๋ณ€๊ฒฝ ๊ฐ์ง€ ์ฐจ๋ก€์˜ ์ผ๋ถ€๋กœ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์ž์ฒด๋กœ๋Š” ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” this.load() ๊ฐ€ ๋ฐ”์ธ๋”ฉ์„ ๋ณ€๊ฒฝํ•˜์ง€๋งŒ ์ƒˆ๋กœ์šด ๋ณ€๊ฒฝ ๊ฐ์ง€ ๋ผ์šด๋“œ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ์ด ๋ฐ”์ธ๋”ฉ์€ ํ–ฅํ›„ ๋ณ€๊ฒฝ ๊ฐ์ง€ ๋ผ์šด๋“œ๊นŒ์ง€ ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  147 ๋Œ“๊ธ€

๋‚˜๋Š” ๋น„์Šทํ•œ ๋ฌธ์ œ์— ์ง๋ฉดํ•ด ์žˆ์œผ๋ฉฐ ์ž์‹์ด ์ดˆ๊ธฐํ™”๋˜๋Š” ๋ฐฉ์‹๊ณผ ๋ถ€๋ชจ๊ฐ€ ์ดˆ๊ธฐํ™” ํ”„๋กœ์„ธ์Šค์˜ ์ผ๋ถ€๋กœ ์ž์‹์„ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ์ธํ•ด ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ 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_ ๋ฌธ์ œ๋กœ ๋‹ค์‹œ ๋Œ์•„์™”์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Ÿฌํ•œ ๋‹ค๋ฅธ ์˜ˆ์™€ ๋‹ฌ๋ฆฌ ์ €๋Š” ์‹ค์ œ๋กœ ๋ฐ๋ชจ์—์„œ ์•„๋ฌด ๊ฒƒ๋„ ํ•˜๋ ค๊ณ  ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๋‚ด ์ปจํŠธ๋กค๋Ÿฌ์—๋Š” ๋…ผ๋ฆฌ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋ชจ๋‘ ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ์™€ ๋ทฐ ๋ฐ”์ธ๋”ฉ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ _ ์—‰๋ง์œผ๋กœ ๋งŒ๋“ค ๊ณต๊ฐ„์ด ์–ด๋”” ์žˆ๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

http://www.bennadel.com/blog/3040-i-have-a-fundamental-misunderstanding-of-change-detection-in-angular-2-beta-8.htm

๋น„์Šทํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€๋งŒ ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. @bennadel ํฌ์ŠคํŒ… ์ž˜

https://github.com/angular/angular/issues/6618

์ง€๊ธˆ๊นŒ์ง€๋Š” ํ•ญ์ƒ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์—ˆ์ง€๋งŒ ์ตœ์†Œํ•œ ๋ณ€๊ฒฝ ๊ฐ์ง€ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ๋” ๋งŽ์€ ๋ฌธ์„œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ์„ ์—ฌ๊ธฐ์„œ ๋‹ค์‹œ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. @bennadel ๊ท€ํ•˜์˜ ๋ฌธ์ œ๋Š” ๋‹ค๋ฅธ ๋ฌธ์ œ๋ฅผ ์ƒ๊ฐ๋‚˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

https://github.com/angular/angular/issues/5177

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€ ์ˆ˜๋ช… ์ฃผ๊ธฐ ํ›„ํฌ๋ฅผ OnBeforeBinding/OnBeforeRendering์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ์†”๋ฃจ์…˜์ด ๊ท€ํ•˜์˜ ๋ฌธ์ œ๋„ ํ•ด๊ฒฐ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@tandu ngAfterViewInit ๋ฅผ ngOnInit ๋ฐ”๊พธ ์„ธ์š”.

@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')" 

๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ ๋‹น์‹ ์˜ ์˜ค๋ฅ˜๋ฅผ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.

์ €๋Š” ์ด ๋ฌธ์ œ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์„ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค. :) ์–ด์ œ ์ €๋Š” ์ œ ๋ฌธ์ œ๊ฐ€ ํŠนํžˆ ์ž…๋ ฅ ์†์„ฑ์— ์˜์กดํ•˜๋Š” ํ˜ธ์ŠคํŠธ ๋ฐ”์ธ๋”ฉ ๊ณผ ๊ด€๋ จ๋˜์–ด ์žˆ์Œ์„ ์ž…์ฆํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

http://www.bennadel.com/blog/3056-host-bindings-are-breaking-the-ngmodel-bridge-in-angular-2-beta-11.htm

๊ตฌ์„ฑ ์š”์†Œ์—๋Š” ๋ณด๊ธฐ ํ…œํ”Œ๋ฆฟ๊ณผ ํ˜ธ์ŠคํŠธ ๋ฐ”์ธ๋”ฉ์ด๋ผ๋Š” ๋‘ ๊ฐ€์ง€ ์ž…๋ ฅ์— ์˜์กดํ•˜๋Š” ๊ฒƒ์ด ์žˆ๊ณ  _๊ทธ ์ค‘ ํ•˜๋‚˜๋งŒ์ด ๋ณ€๊ฒฝ ์˜ˆ์™ธ๋ฅผ ์ผ์œผํ‚ค๊ธฐ ๋•Œ๋ฌธ์— ์ด ์‹œ์ ์—์„œ ์ด๊ฒƒ์ด ๋ฒ„๊ทธ ๋ผ๊ณ  ๋ฏฟ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค ๋ฌธ์ œ๋ฅผ ์ผ์œผ์ผฐ๋‹ค๋ฉด ๋‹ค๋ฅธ ์ƒ๊ฐ์„ ํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ ์ค‘ ํ•˜๋‚˜๋งŒ์ด ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ๋ฒ„๊ทธ ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@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 ๋Œ€ํ•ด ์ •๋ง ํ˜ผ๋ž€ ์Šค๋Ÿฌ์› ์Šต๋‹ˆ๋‹ค ...

http://plnkr.co/edit/myX2Alx9jie2q0FDIME7?p=preview

@๋ฆฌํ‹ฐ์•™

๋‚˜๋Š” ์—ฌ์ „ํžˆ ์ž…๋ ฅ ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ indicatorStyle()์ด ํ˜ธ์ถœ๋˜๋Š” ์ด์œ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.
๋” ์„ค๋ช…ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ˆ?

indicatorStyle() ๋Š” ๋ณด๊ธฐ์—์„œ [ngStyle] ์— ๋ฐ”์ธ๋”ฉ๋˜๋ฏ€๋กœ ๋ณ€๊ฒฝ ๊ฐ์ง€๊ธฐ๊ฐ€ ์‹คํ–‰๋  ๋•Œ ํ•ญ์ƒ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ž…๋ ฅ์ด ์‹ค์ œ๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€์— ๊ด€๊ณ„์—†์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

ngDoCheck๊ฐ€ ๋‘ ๋ฒˆ ์‹คํ–‰๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค.
์ฒซ ๋ฒˆ์งธ๊ฐ€ ์‹คํ–‰๋˜๋Š” ์ด์œ ๋ฅผ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ๋‘ ๋ฒˆ์งธ ngDoCheck์— ๋Œ€ํ•ด ์ •๋ง ํ˜ผ๋ž€ ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค ...

์ด๊ฒƒ์€ ์ด ์Šค๋ ˆ๋“œ์˜ ์•ž๋ถ€๋ถ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ๋ณ€๊ฒฝ ๊ฐ์ง€๊ฐ€ ํ•ญ์ƒ ๊ฐœ๋ฐœ ๋ชจ๋“œ์—์„œ ๋‘ ๋ฒˆ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํ”„๋กœ๋•์…˜์—์„œ ์–ด๋ ค์šด ๋ฒ„๊ทธ๋ฅผ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ๋Š” ๋ณ€๊ฒฝ ๊ฐ์ง€ ์ค‘์— ๋ฐ”์ธ๋”ฉ์„ ๋ณ€๊ฒฝํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์—†๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

setTimeout()์˜ ๋ณ€ํ˜•

์—…๋ฐ์ดํŠธ: CompanionHeightLast ๋น„๊ต ์—†์ด CPU๊ฐ€ 100% ๋ฏธ์ณค์Šต๋‹ˆ๋‹ค. AFAIK ์—…๋ฐ์ดํŠธ๊ฐ€ ์žฌ๊ท€์ ์œผ๋กœ ์ง„ํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค!

์—…๋ฐ์ดํŠธ 2: ํ”Œ๋Ÿฐ์ปค ์˜ˆ์ œ

"companionHeight"์— ๋ฐ”์ธ๋”ฉ๋œ <img>์˜ ๋†’์ด๋ฅผ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•ด ๋™์  <ul> ๋ธ”๋ก์˜ ๋†’์ด๋ฅผ ์›ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋„ˆ๋ฌด ์‚ฌ์•…ํ•ฉ๋‹ˆ๋‹ค ... ๊ทธ๋Ÿฌ๋‚˜ ๋‹ค์Œ ์€ Observable์„ ์‚ฌ์šฉํ•˜์—ฌ

๋‹ค์Œ์€ ๋†’์ด๊ฐ€ ๋ชจ๋‹ˆํ„ฐ๋ง๋˜๋Š” <ul> ์š”์†Œ์ž…๋‹ˆ๋‹ค.

<ul class="title-list-ul" #listul (window:resize)="setCompanionHeight(listul)">

๋‹ค์Œ์€ ์ œ์–ด๋˜๋Š” <img> ์š”์†Œ์ž…๋‹ˆ๋‹ค.

<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");
        }
    }


์ด ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์ง€๋งŒ ๋‹ค๋ฅธ(์œ ์‚ฌํ•œ?) ์›์ธ๊ณผ ๋‹ค๋ฅธ ์†”๋ฃจ์…˜์ด ์žˆ์Œ์„ ์œ ์˜ํ•˜์‹ญ์‹œ์˜ค.

  • Angular ์•ฑ์ธ https://github.com/GeoscienceAustralia/GNSS-Site-Manager ์—๋Š” 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()๋กœ ์ด๋™ํ•˜์—ฌ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ„๋‹จํ•œ ๊ฒƒ๋“ค์ด ๊ฐ๋„์—์„œ ๊ทธ๋ ‡๊ฒŒ ๋งŽ์€ ํ˜ผ๋ž€์„ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ๋†€๋ž์Šต๋‹ˆ๋‹ค.

๊ฑฑ์ •ํ•˜์ง€ ๋งˆ์„ธ์š”, ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค๋„ ๋ชจ๋‘ ๋ˆˆ์น˜ ์ฑ˜์Šต๋‹ˆ๋‹ค ๐Ÿ˜•
image

@jakeNiemiec ์ ˆ๋ฆ„๋ฐœ์ด ์ง์—…, ํŠธ๋กค, ์•„๋ฌด๋„ Angularjs๋ฅผ ๋” ์ด์ƒ ๊ฒ€์ƒ‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค
https://trends.google.com/trends/explore?date=all&q=Angular%20tutorial ,React%20tutorial
image

์˜ˆ, ๋” ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ํ•„์‚ฌ์ ์œผ๋กœ "๊ฐ๋„ ์ž์Šต์„œ"๋ฅผ Google์— ๊ฒ€์ƒ‰ํ•ด์•ผ ํ•˜๋ฏ€๋กœ "ํ˜ผ๋ž€"์— ๋Œ€ํ•œ ์ดˆ๊ธฐ ์˜๊ฒฌ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๊ฑฑ์ •ํ•˜์ง€ ๋งˆ์„ธ์š”. ์ •ํ™•ํ•œ ์‚ฌ์šฉ ํ†ต๊ณ„๋Š” npm์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. http://www.npmtrends.com/react-vs-@angular/cli -vs-vue-vs-@angular/core
image
image

๋ฌธ์ œ์˜ ์–‘๋งŒ ๋น„๊ตํ•˜์‹ญ์‹œ์˜ค. 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

์ด ๋ฌธ์ œ๋Š” ํ™œ๋™์ด ์—†์–ด ์ž๋™์œผ๋กœ ์ž ๊ฒผ์Šต๋‹ˆ๋‹ค.
์œ ์‚ฌํ•˜๊ฑฐ๋‚˜ ๊ด€๋ จ๋œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ƒˆ ๋ฌธ์ œ๋ฅผ ์ œ์ถœํ•˜์‹ญ์‹œ์˜ค.

์ž๋™ ๋Œ€ํ™” ์ž ๊ธˆ ์ •์ฑ… ์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด์„ธ์š”.

_์ด ์ž‘์—…์€ ๋ด‡์— ์˜ํ•ด ์ž๋™์œผ๋กœ ์ˆ˜ํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค._

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰