๊ฒฉ๋ฆฌ ๋ฒ์๊ฐ์๋ ์์์ ๋ํ 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>
์ฌ๋ฏธ์๋ ์ฝ๋ ์ผ์ด์ค ... 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
. ์ง์๋ฌธ ๋ฐ์ธ๋ฉ์ ์์ ํ ๋
๋ฆฝ์ ์ธ ๊ฐ๋
์
๋๋ค. ๋์ ํจ๊ป ์ ์๋ ํ ์ ์์ง๋ง ์๋ก์ ๊ตฌํ / ๋ด๋ถ ์์
์ ์ํฅ์์ฃผ์ง ์์์ผํฉ๋๋ค.
์ด๋ฏธ ์ธ๊ธํ๋ฏ์ด ํน์ ์ฝ๋ฐฑ์ด ์ ๋ฐ์ดํธ ๋ ๊ฐ์ ์ก์ธ์คํด์ผํ๋ ๊ฒฝ์ฐ ๋ช ๊ฐ์ง ์ต์ ์ด ์์ต๋๋ค.
์ ๋ฐ์ดํธ ๋ ๊ฐ์ ์ฝ๋ฐฑ์ ์ธ์๋ก ์ ๋ฌํฉ๋๋ค.
๋น๋๊ธฐ ์ ์ผ๋ก ์คํํด์ผํ๋ ๊ฒฝ์ฐ (์ฆ, ๋ค์ด์ ์คํธ๊ฐ ์ข
๋ฃ๋๊ณ ๋ชจ๋ ๋ฐ์ธ๋ฉ์ด ์ ํ ๋ ํ) ํญ์ ์ฝ๋ฐฑ ๋ด์์ $timeout
์ฌ์ฉํ ์ ์์ต๋๋ค.
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()" />
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
Narretz, ์ ์ ์ผ๋ก ๋์ํ์ง ์์ต๋๋ค. ์๋ฐฉํฅ ๋ฐ์ธ๋ฉ์ด ์ฐ์ ํ๋ ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์์ ์ฒด๊ฒฐ ํ ๊ณ์ฝ์ด ์์ต๋๋ค. ๋ฐ์ธ๋ฉ ์ฒด์ธ์ ๋ฐ๋ผ ์ด๋์์๋ ๋ณ๊ฒฝ์ด ์ด๋ฃจ์ด์ง๋ฉด ๊ณ์ํ๊ธฐ ์ ์ ์ ์ฒด ์ฒด์ธ์ ์ ๋ฐ์ดํธํด์ผํฉ๋๋ค. ๋ฐ๋ผ์ ๋ค๋ฅธ ์ง์๋ฌธ์ด์ด ์ง์๋ฌธ์์ ์์๋๊ณ ๋ ์๋์ชฝ์์๋ ๊ฒ์ด ๋ฐ์ธ๋ฉ์ ๋ฐ์ธ๋ฉ์ ๋ฐ์ธ๋ฉ ๋๋๋ผ๋ ... ํด๋น ๋ชจ๋ธ์ด ์ ๋ฐ์ดํธ๋๋ฉด ์คํ ๋งจ ์๋์์๋ ์๋ ์ปจํธ๋กค๋ฌ ๋ฒ์ ๋ชจ๋ธ์ ์ด์ ์ ๋์ผํ ๋ค์ด์ ์คํธ ์ฃผ๊ธฐ๋ก ์ ๋ฐ์ดํธ๋์ด์ผํฉ๋๋ค. ๋ค๋ฅธ ๊ธฐ๋ฅ์ ๊ณ์ํฉ๋๋ค. ์๋น์๋ก๋ถํฐ ๊ธฐ๋๋๋ ๊ฒ์ ๋๋ค.