Angular.js: bug(ngModel): `$setViewValue`๋Š” ์ ์ ˆํ•œ `trigger`๋กœ ํ˜ธ์ถœ๋  ๋•Œ `$$debounceViewValue`๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2016๋…„ 07์›” 08์ผ  ยท  3์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: angular/angular.js

_๊ธฐ๋Šฅ_์„ ์š”์ฒญํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด _๋ฒ„๊ทธ_๋ฅผ ๋ณด๊ณ ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?
๋ฒŒ๋ ˆ.

ํ˜„์žฌ ํ–‰๋™์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
NgModelController#$setViewValue(value, trigger) ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ngModelOptions ์—†๊ฑฐ๋‚˜ ngModelOptions#updateOnDefault ๊ฐ€ true์ธ ๊ฒฝ์šฐ์—๋งŒ $$debounceViewValue() NgModelController#$setViewValue(value, trigger) ๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
์—ฌ๊ธฐ๋ฅผ ์ฐธ์กฐ

ํ˜„์žฌ ๋™์ž‘์ด ๋ฒ„๊ทธ์ธ ๊ฒฝ์šฐ https://plnkr.co ๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ๋ฐฉ๋ฒ•(ํ…œํ”Œ๋ฆฟ: http://plnkr.co/edit/tpl:yBpEi4)์„ ํ†ตํ•ด ์žฌํ˜„ ๋‹จ๊ณ„์™€ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ๋ฌธ์ œ์˜ ์ตœ์†Œ ๋ฐ๋ชจ๋ฅผ ์ œ๊ณต
๋ฐ๋ชจ
๋‘ ๋ฒ„ํŠผ์„ ๋ชจ๋‘ ํด๋ฆญํ•˜๋ฉด NgModelController ๋ชจ๋‘ ์—…๋ฐ์ดํŠธ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค.
{updateOn: 'blur'} ๊ฐ€ ์žˆ๋Š” ์‚ฌ๋žŒ์€ ์‹ค๋งํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์˜ˆ์ƒ๋˜๋Š” ๋™์ž‘์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
NgModelController#$setViewValue(value, trigger) ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ngModelOptions#updateOn trigger ํฌํ•จ๋œ ๊ฒฝ์šฐ ngModelOptions#updateOn $$debounceViewValue() ๋„ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

ํ–‰๋™์„ ๋ฐ”๊พธ๋Š” ๋™๊ธฐ/์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•˜๊ฒŒ ํ•˜๋ ค๋ฉด :grin:

์–ด๋–ค ๋ฒ„์ „์˜ Angular์™€ ์–ด๋–ค ๋ธŒ๋ผ์šฐ์ €/OS๊ฐ€ ์ด ๋ฌธ์ œ์˜ ์˜ํ–ฅ์„ ๋ฐ›์Šต๋‹ˆ๊นŒ? ๋˜ํ•œ ์ตœ์‹  ์•ˆ์ • ๋ฐ ์Šค๋ƒ…์ƒท(https://code.angularjs.org/snapshot/) ๋ฒ„์ „์œผ๋กœ ํ…Œ์ŠคํŠธํ•˜์‹ญ์‹œ์˜ค.
1.5.7์—์„œ๋งŒ ์‹œ๋„ํ–ˆ์ง€๋งŒ ๋งŽ์€ ๋ฒ„์ „์— ์˜ํ–ฅ์„ ๋ฏธ์น  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ธฐํƒ€ ์ •๋ณด(์˜ˆ: ์Šคํƒ ์ถ”์ , ๊ด€๋ จ ๋ฌธ์ œ, ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• ์ œ์•ˆ)
์•„๋‹ˆ์˜ค : ํ˜ผ๋ž€์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค:

forms low investigation broken expected use bug

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

BTW, ์ด๊ฒƒ์€ gitter ์— ๋Œ€ํ•œ @jeserkin๊ณผ์˜ ํ† ๋ก ์˜ ๋ถ€์‚ฐ๋ฌผ์ด์—ˆ๊ณ  ๊ทธ๋Š” ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๊ด€์‹ฌ์„ ํ‘œ๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค. (๋ป”๋ป”ํ•˜๊ฒŒ) ๊ทธ๋ฅผ ์œ„ํ•ด ์ €์žฅํ•ฉ๋‹ˆ๋‹ค :stuck_out_tongue:

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

๊ทธ๊ฒƒ์€ ํ™•์‹คํžˆ ์˜ณ์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด์ƒํ•œ ์ ์€ ๋‘ ๋ฒˆ์งธ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๊ณ  ์ฒซ ๋ฒˆ์งธ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด 4๊ฐœ๊ฐ€ ๋ชจ๋‘ ์—…๋ฐ์ดํŠธ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค!

๋‘ ๋ฒˆ์งธ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅธ ํ›„ ์ฒซ ๋ฒˆ์งธ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์ž‘๋™ํ•˜๋Š” ์ด์œ ๋Š” ๋ฒ„ํŠผ ํด๋ฆญ์œผ๋กœ ํŠธ๋ฆฌ๊ฑฐ๋˜๋Š” ๋‹ค์ด์ œ์ŠคํŠธ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‹ค์ด์ œ์ŠคํŠธ๋‹น ngModel watch-action์ด ์‹คํ–‰๋˜์–ด ๊ฐ’์„ ๋™๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค( ์—ฌ๊ธฐ ์ฐธ์กฐ).

๋ฌธ์ œ๋Š” ์ด๊ฒƒ์ด ๋‹ค์ด์ œ์ŠคํŠธ ์™ธ๋ถ€์—์„œ ๋ฐœ์ƒํ•  ๋•Œ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‹ค์ด์ œ์ŠคํŠธ ๋‚ด๋ถ€์—์„œ๋„ ๊ฐ’์€ ์ฒซ ๋ฒˆ์งธ ๊ฒฝ์šฐ์™€ ๊ฐ™์ด ๋™๊ธฐ์ ์œผ๋กœ ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค( updateOnDefault === true ).

BTW, ์ด๊ฒƒ์€ gitter ์— ๋Œ€ํ•œ @jeserkin๊ณผ์˜ ํ† ๋ก ์˜ ๋ถ€์‚ฐ๋ฌผ์ด์—ˆ๊ณ  ๊ทธ๋Š” ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๊ด€์‹ฌ์„ ํ‘œ๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค. (๋ป”๋ป”ํ•˜๊ฒŒ) ๊ทธ๋ฅผ ์œ„ํ•ด ์ €์žฅํ•ฉ๋‹ˆ๋‹ค :stuck_out_tongue:

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