Angular.js: ๊ฒฉ๋ฆฌ ๋ฒ”์œ„์— ๋Œ€ํ•œ ๋ชจ๋ธ ์—…๋ฐ์ดํŠธ ์ „์— Onchange๊ฐ€ ํŠธ๋ฆฌ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2013๋…„ 10์›” 21์ผ  ยท  11์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: angular/angular.js

๊ฒฉ๋ฆฌ ๋ฒ”์œ„๊ฐ€์žˆ๋Š” ์š”์†Œ์— ๋Œ€ํ•œ Onchange ์ด๋ฒคํŠธ๊ฐ€ ๋ชจ๋ธ ์—…๋ฐ์ดํŠธ ์ „์— ํŠธ๋ฆฌ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.

์˜ˆ:

<!doctype html>
<html ng-app="App">
    <head>

        <link rel="stylesheet" href="http://code.jquery.com/ui/1.10.3/themes/smoothness/jquery-ui.css" />

        <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.js"></script>
        <script src="http://code.angularjs.org/1.0.6/angular.js"></script>
        <script src="http://code.jquery.com/ui/1.10.3/jquery-ui.js"></script>

        <script type="text/javascript">
            "use strict"

            var App = angular.module('App', []);
            App.controller('Ctrl', function ($scope,$timeout) {

                $scope.change1 = function () {
                    console.warn("inside change", $scope.y);
                }

                $scope.change2 = function () {
                    console.warn("inside change", $scope.x);    
                }

            });

            App.directive("wminput", function () {
                return {
                    restrict: "E",
                    replace: true,
                    scope: {
                        "onChange":"&",
                        "value": "="
                    },
                    template: '<input type="text" data-ng-model="value" data-ng-change="onChange();">'
                }
            });

        </script>

    </head>
    <body>
        <div data-ng-controller="Ctrl">
            "Onchange will be triggered after the model update"
            <input data-ng-change="change1()" data-ng-model="y">
            <br><br>
            "Onchange will be triggered before the model update"
            <wminput on-change="change2()" value="x"></wminput>
        </div>

    </body>
</html>
$compile forms low works as expected confusing bug

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

Narretz, ์ „์ ์œผ๋กœ ๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์–‘๋ฐฉํ–ฅ ๋ฐ”์ธ๋”ฉ์ด ์šฐ์„ ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฐœ๋ฐœ์ž์™€ ์ฒด๊ฒฐ ํ•œ ๊ณ„์•ฝ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”์ธ๋”ฉ ์ฒด์ธ์„ ๋”ฐ๋ผ ์–ด๋””์—์„œ๋‚˜ ๋ณ€๊ฒฝ์ด ์ด๋ฃจ์–ด์ง€๋ฉด ๊ณ„์†ํ•˜๊ธฐ ์ „์— ์ „์ฒด ์ฒด์ธ์„ ์—…๋ฐ์ดํŠธํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‹ค๋ฅธ ์ง€์‹œ๋ฌธ์ด์ด ์ง€์‹œ๋ฌธ์—์„œ ์ƒ์†๋˜๊ณ  ๋” ์•„๋ž˜์ชฝ์—์žˆ๋Š” ๊ฒƒ์ด ๋ฐ”์ธ๋”ฉ์˜ ๋ฐ”์ธ๋”ฉ์— ๋ฐ”์ธ๋”ฉ ๋˜๋”๋ผ๋„ ... ํ•ด๋‹น ๋ชจ๋ธ์ด ์—…๋ฐ์ดํŠธ๋˜๋ฉด ์Šคํƒ ๋งจ ์•„๋ž˜์—์žˆ๋Š” ์›๋ž˜ ์ปจํŠธ๋กค๋Ÿฌ ๋ฒ”์œ„ ๋ชจ๋ธ์€ ์ด์ „์— ๋™์ผํ•œ ๋‹ค์ด์ œ์ŠคํŠธ ์ฃผ๊ธฐ๋กœ ์—…๋ฐ์ดํŠธ๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์„ ๊ณ„์†ํ•ฉ๋‹ˆ๋‹ค. ์†Œ๋น„์ž๋กœ๋ถ€ํ„ฐ ๊ธฐ๋Œ€๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

์žฌ๋ฏธ์žˆ๋Š” ์ฝ”๋„ˆ ์ผ€์ด์Šค ... http://plnkr.co/edit/lsrga8qMcbgNWATrVht3?p=preview

์ด๋Š” onChange ํ•จ์ˆ˜๊ฐ€ ๋ถ€๋ชจ ๋ฒ”์œ„ ๋„ˆ๋น„ '&'๋ฐ”์ธ๋”ฉ์— ์œ„์ž„ ๋œ ๊ฒฝ์šฐ์—๋งŒ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” angularjs๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ RAD ๋„๊ตฌ๋ฅผ ๊ฐœ๋ฐœํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด๊ฒƒ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ชจ๋“  ์œ„์ ฏ์— isolateScope๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ์ฃผ์š” ๋ฒ„๊ทธ์˜€์Šต๋‹ˆ๋‹ค.
onChange์— ๋Œ€ํ•œ ํ”„๋ก์‹œ ๋ฉ”์†Œ๋“œ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

https://studio.wavemaker.com/์„ ๋ณด์„ธ์š”

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค, Vinay

์ด ํ”„๋ก์‹œ์˜ ์˜ˆ์™€ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์„ ๊ฒŒ์‹œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ด๊ฒƒ์„ ๋””๋ฒ„๊น…ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

http://plnkr.co/edit/Xe6ErQrg7WL6aAIoM9Gd?p=preview ์—์„œ ์˜ˆ์ œ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

์กฐ๋งŒ๊ฐ„ ์ˆ˜์ • ๋˜๋‚˜์š”? sooooo ํ˜ผ๋ž€ ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.

์ถ”๊ฐ€ ๊ณ ๋ ค ํ›„, ์ด๊ฒƒ์ด ์˜ˆ์ƒ๋˜๋Š” ๋™์ž‘์ด๋ผ๊ณ  ๋งํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. plnkr ์˜ˆ์ œ์—์„œ ngModel์˜ ๊ฐ’์€ ์ปจํŠธ๋กค๋Ÿฌ์™€ ์ง€์‹œ๋ฌธ ๋ฒ”์œ„ ์‚ฌ์ด์— ๋‘ ๊ฐœ์˜ ๋ฐ”์ธ๋”ฉ ๋œ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค. ์ด์ œ ์ง€์‹œ๋ฌธ์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ๋•Œ ngModel์€ ๋จผ์ € _isolate_ ๋ฒ”์œ„๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ๋™์ผํ•œ ๋‹ค์ด์ œ์ŠคํŠธ์—์„œ ngChange๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์–‘๋ฐฉํ–ฅ ๋ฐ”์ธ๋”ฉ์ด ์•„์ง ์ง€์‹œ์–ด ๋ฒ”์œ„์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์„ ํƒํ•˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ๋ถ€๋ชจ ๋ฒ”์œ„์˜ ngChange๋Š” x ์˜ "์ด์ „"๊ฐ’์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ์ด์ œ ์–‘๋ฐฉํ–ฅ ๋ฐ”์ธ๋”ฉ ๊ฐ์‹œ์ž๋Š” ๊ฐ’์„ ์•ˆ์ •ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์ตœ์†Œ 2 ๊ฐœ์˜ ๋‹ค์ด์ œ์ŠคํŠธ์ฃผ๊ธฐ๊ฐ€ ํ•„์š”ํ•˜๋ฏ€๋กœ ์ปจํŠธ๋กค๋Ÿฌ ๋ฒ”์œ„๋Š” ngChange๊ฐ€ ํ˜ธ์ถœ ๋œ ํ›„์— ๋งŒ โ€‹โ€‹์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค.
๋‚˜๋Š” ์ด๊ฒƒ์ด ํ˜ผ๋ž€ ์Šค๋Ÿฝ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•˜์ง€๋งŒ ๊ทธ๊ฒƒ์ด ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ngModel์— ๋ฐ”์ธ๋”ฉํ•˜๋Š” ๊ฐ’์„ ๋ณด์œ ํ•˜๋Š” ์ง€์‹œ๋ฌธ์— ๊ฐœ์ฒด๋ฅผ ๋ฐ”์ธ๋”ฉํ•˜์—ฌ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒํ•˜๋ฉด ๊ฐ’์ด ๊ฒฉ๋ฆฌ ๋ฐ ์ปจํŠธ๋กค๋Ÿฌ ๋ฒ”์œ„์—์„œ ๋™์‹œ์— ์ฐธ์กฐ๋กœ ์„ค์ •๋˜๊ณ  ngChange๊ฐ€ ์‹คํ–‰๋  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. http://plnkr.co/edit/fs7S6yX1a5aeo1Ese522?p=preview

Narretz, ์ „์ ์œผ๋กœ ๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์–‘๋ฐฉํ–ฅ ๋ฐ”์ธ๋”ฉ์ด ์šฐ์„ ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฐœ๋ฐœ์ž์™€ ์ฒด๊ฒฐ ํ•œ ๊ณ„์•ฝ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”์ธ๋”ฉ ์ฒด์ธ์„ ๋”ฐ๋ผ ์–ด๋””์—์„œ๋‚˜ ๋ณ€๊ฒฝ์ด ์ด๋ฃจ์–ด์ง€๋ฉด ๊ณ„์†ํ•˜๊ธฐ ์ „์— ์ „์ฒด ์ฒด์ธ์„ ์—…๋ฐ์ดํŠธํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‹ค๋ฅธ ์ง€์‹œ๋ฌธ์ด์ด ์ง€์‹œ๋ฌธ์—์„œ ์ƒ์†๋˜๊ณ  ๋” ์•„๋ž˜์ชฝ์—์žˆ๋Š” ๊ฒƒ์ด ๋ฐ”์ธ๋”ฉ์˜ ๋ฐ”์ธ๋”ฉ์— ๋ฐ”์ธ๋”ฉ ๋˜๋”๋ผ๋„ ... ํ•ด๋‹น ๋ชจ๋ธ์ด ์—…๋ฐ์ดํŠธ๋˜๋ฉด ์Šคํƒ ๋งจ ์•„๋ž˜์—์žˆ๋Š” ์›๋ž˜ ์ปจํŠธ๋กค๋Ÿฌ ๋ฒ”์œ„ ๋ชจ๋ธ์€ ์ด์ „์— ๋™์ผํ•œ ๋‹ค์ด์ œ์ŠคํŠธ ์ฃผ๊ธฐ๋กœ ์—…๋ฐ์ดํŠธ๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์„ ๊ณ„์†ํ•ฉ๋‹ˆ๋‹ค. ์†Œ๋น„์ž๋กœ๋ถ€ํ„ฐ ๊ธฐ๋Œ€๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•ฝ๊ฐ„ ๊ด€๋ จ์ด ์žˆ๊ณ  ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํ˜ผ๋ž€ ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ngChange ์ฃผ๋Š” ๋˜ ๋‹ค๋ฅธ ํ•„๋“œ์— ํŠธ๋ฆฌ๊ฑฐ ๊ฒ€์ฆ์— ngModel , ๋ณ€๊ฒฝ์ด๋˜๊ธฐ ์ „์— ํŠธ๋ฆฌ๊ฑฐ $modelValue ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค. ๊ฒ€์ฆ์„ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

$timeout ๋ฅผ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์™œ ๊ทธ๊ฒƒ์ด ํ•„์š”ํ•œ์ง€ ์—ฌ์ „ํžˆ ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ:
http://codepen.io/jakobadam/pen/qmBdrJ?editors=1010

์•ˆ๋ถ€, Jakob

์ด ๋ฌธ์ œ๋ฅผ ๋‹ค์‹œ ๊ฒ€ํ†  ํ•  ๊ณ„ํš์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์žฌ ๊ฐœ์„ค?

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

๋‚˜๋Š” ์งˆ๋ฌธ์„ ๊ณ ์ˆ˜ํ•œ๋‹ค. ์ด๊ฒƒ์€ ์žฌ๊ฒ€ํ†  ๋  ๊ฒƒ์ธ๊ฐ€?

๋‚˜๋Š” ๊ทธ๋ ‡๊ฒŒ ์ƒ๊ฐํ•˜์ง€ ์•Š๋Š”๋‹ค. ํ˜„์žฌ ๋™์ž‘์ด ์˜ˆ์ƒ๋˜๋ฉฐ ์–ด๋–ค ๊ฒฝ์šฐ์—๋Š” ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š์ง€๋งŒ ์ ์–ด๋„ ๊ทธ์— ๋”ฐ๋ฅธ ๋งŽ์€ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ ๋ณ€๊ฒฝํ•˜๋ฉด (a) ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด๋˜๊ณ  (b) ๋งŽ์€ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์ง€์›๋˜์ง€ ์•Š๊ฒŒ๋ฉ๋‹ˆ๋‹ค (์˜ˆ : ngChange ๊ฐ’์„ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•ด _before_ ๋ถ€๋ชจ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋ ค๋Š” ๊ฒฝ์šฐ). ๋ชจ๋‘๋ฅผ ํ–‰๋ณตํ•˜๊ฒŒ ํ•  ์ˆ˜์—†๋Š” ๊ฒฝ์šฐ ์ค‘ ํ•˜๋‚˜์ด๋ฏ€๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฒ„์ „์„ ๊ณ ์ˆ˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

  • ๋ง์ด๋œ๋‹ค.
  • ๊ธฐ์กด ์‚ฌ์šฉ์ž๋ฅผ ํ•ด์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์•ฝ๊ฐ„์˜ ์ถ”๊ฐ€ ์ฝ”๋“œ ๋น„์šฉ์ด ๋“ค๋”๋ผ๋„๋ณด๋‹ค ๊ตฌ์ฒด์ ์ธ / ๊ณ ๊ธ‰ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค (์•„๋ž˜ ์ฐธ์กฐ).

ํ˜„์žฌ ๊ตฌํ˜„ ngChange ๋‹จ๋‹จํžˆ์˜ ๊ฐœ๋…์— ๋ฐ”์ธ๋”ฉ ngModel . ์ง€์‹œ๋ฌธ ๋ฐ”์ธ๋”ฉ์€ ์™„์ „ํžˆ ๋…๋ฆฝ์  ์ธ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค. ๋‘˜์€ ํ•จ๊ป˜ ์ž˜ ์ž‘๋™ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์„œ๋กœ์˜ ๊ตฌํ˜„ / ๋‚ด๋ถ€ ์ž‘์—…์— ์˜ํ–ฅ์„์ฃผ์ง€ ์•Š์•„์•ผํ•ฉ๋‹ˆ๋‹ค.

#

์ด๋ฏธ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ํŠน์ • ์ฝœ๋ฐฑ์ด ์—…๋ฐ์ดํŠธ ๋œ ๊ฐ’์— ์•ก์„ธ์Šคํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ ๋ช‡ ๊ฐ€์ง€ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์—…๋ฐ์ดํŠธ ๋œ ๊ฐ’์„ ์ฝœ๋ฐฑ์— ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

  2. ๋น„๋™๊ธฐ ์ ์œผ๋กœ ์‹คํ–‰ํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ (์ฆ‰, ๋‹ค์ด์ œ์ŠคํŠธ๊ฐ€ ์ข…๋ฃŒ๋˜๊ณ  ๋ชจ๋“  ๋ฐ”์ธ๋”ฉ์ด ์ „ํŒŒ ๋œ ํ›„) ํ•ญ์ƒ ์ฝœ๋ฐฑ ๋‚ด์—์„œ $timeout ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  3. ngChange ์˜ "๋น„๋™๊ธฐ"๋ฒ„์ „์„ ์›ํ•˜๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž ์ง€์ • ์ง€์‹œ๋ฌธ์œผ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. (๋‚ด์žฅ ์ง€์‹œ๋ฌธ์„ ๋ฎ์–ด ์“ธ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์ ˆ๋Œ€ ๊ถŒ์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.) ์˜ˆ :

.directive('myAsyncChange', function($timeout) {
  return {
    restrict: 'A',
    require: 'ngModel',
    link: function(scope, element, attr, ctrl) {
      ctrl.$viewChangeListeners.push(function() {
        $timeout(function() {
          scope.$eval(attr.myAsyncChange);
        });
      });
    }
  };
});
<input ng-model="foo" my-async-change="onChange()" />
์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰