ngModelController $parser ν¨μλ₯Ό μ¬μ©νμ¬ νΉμ κ·μΉμ μ€μνλλ‘ μ λ ₯ κ°μ μ μ©ν λ $parser ν¨μλ λ°λ³΅μ μΈ "μλͺ»λ" ν€ μ λ ₯μ λν΄ νΈμΆλμ§ μμΌλ―λ‘ μλͺ»λ λ¬Έμκ° μΆκ°λ μ μμ΅λλ€.
μλ μμμ μ§μλ¬Έμ μ«μκ° μλ λͺ¨λ λ¬Έμλ₯Ό μ κ±°νκΈ° μν κ²μ λλ€. λλΆλΆ μλνμ§λ§ λμΌν μ«μκ° μλ λ¬Έμλ₯Ό μ°μμΌλ‘ λ λ² μ λ ₯νλ©΄(μ: 'xx') λ¨μΌ 'x'κ° μ λ ₯μ νμλ©λλ€. 'x'λ₯Ό μΈ λ²μ§Έ μ λ ₯νλ©΄ 'x'κ° μ κ±°λ©λλ€.
λλ λν μ€ν¨ν ν μ€νΈ μΌμ΄μ€λ₯Ό ν¬ν¨μμΌ°λ€.
λͺ¨λ μ½λλ http://codepen.io/visnup/pen/YXgLVq?editors=101 μμ μ€ν μ€μ λλ€
μ§μμ΄ μ¬μ©
<div ng-app="digits">
<input ng-model="number" placeholder="digits only" digits-only />
</div>
μ§λ Ή
angular
.module('digits', [])
.directive('digitsOnly', function() {
return {
require: 'ngModel',
link: function link(scope, element, attrs, ngModel) {
ngModel.$parsers.push(function(value) {
var numbers = value.replace(/\D/g, '');
element.val(numbers);
return numbers;
});
}
};
});
μ€ν¨ν ν μ€νΈ μΌμ΄μ€
describe('digits', function() {
beforeEach(angular.mock.module('digits'));
let scope, input;
beforeEach(inject(function($compile, $rootScope) {
scope = $rootScope;
input = $compile('<input ng-model="number" digits-only />')(scope);
}));
// works
it('should block non-digits', function() {
input.val('111x');
input.triggerHandler('input');
expect(input.val()).to.equal('111');
});
// doesn't work
it('should not flash incorrect input', function() {
input.val('111x');
input.triggerHandler('input');
input.val('111x');
input.triggerHandler('input');
expect(input.val()).to.equal('111');
});
});
μ΄κ²μ #10700μμ μ΄μ μ μ κΈ°λμμ΅λλ€.
$parsers
μ (μ¬λ³Έ)λ₯Ό λ³ννκΈ°μν κ²μ
λλ€ $viewValue
λ‘ "μ μ₯"νκΈ° μ μ $modelValue
(κ·Έλ¦¬κ³ κ·Έ κ·νμ μμ κ°νκ³ μλ κ²μ
λλ€). μ€μ λ‘ $viewValue
λ³κ²½νλ κ²μ μλλ―λ‘(μμμ κ°μ μ
λ°μ΄νΈνμ§λ§) μκΈ°μΉ μμ λμμΌλ‘ μ΄μ΄μ§λλ€.
μ΄κ²μ μλ₯Ό λ€μ΄ λ μ μ€λͺ λ©λλ€.
$modelValue
: μ μλμ§ μμ$viewValue
: 1element.val()
: 1$modelValue
: 1$viewValue
: 1element.val()
: 1$modelValue
: 1$viewValue
: 1xelement.val()
: 1x$modelValue
: 1$viewValue
: 1x(νμ fnμμ μ
λ°μ΄νΈλμ§ μμ)element.val()
: 1(νμ fnμμ μ
λ°μ΄νΈλ¨)$modelValue
: 1$viewValue
: 1x (μ΄μ $viewValue
λ 1x
μμΌλ―λ‘ κ°μ§λ λ³κ²½ μ¬ν μμ)element.val()
: 1x$viewValue
μμ λ³κ²½ μ¬νμ΄ κ°μ§λμ§ μμμΌλ―λ‘) !!!$modelValue
: 1$viewValue
: 1xelement.val()
: 1x$modelValue
: 1$viewValue
: 1xxelement.val()
: 1xx$modelValue
: 1$viewValue
: 1xxelement.val()
: 1μ΄λ₯Ό μ μ νκ² μ²λ¦¬νλ λͺ κ°μ§ "κ°λ" λ°©λ²μ΄ μμ΅λλ€. μ:
ngModel.$parsers.push(function (value) {
var numbers = value.replace(/\D/g, '');
if (numbers !== value) {
ngModel.$setViewValue(numbers); // Update the `$viewValue`
ngModel.$render(); // Update the element's displayed value
}
return numbers;
});
λͺ¨λ κ²μ΄ μμλλ‘ μλνλ κ² κ°μμ μ΄ κΈμ λ«μ΅λλ€.
@visnup , λͺ
ννμ§ μμ μ¬νμ΄ μμΌλ©΄ μΈμ λ μ§ μ§λ¬Έμ λν νμ μ‘°μΉλ₯Ό μ·¨νμμμ€.
μ΄ λ¬Έμ λ μ $viewValueκ° μ»€λ°λμ§ μμ λλ§λ€ ν€ μ λ ₯μ λ°λ³΅ν λ λ°μν©λλ€. $parsers 컬λ μ μμ μ μλ $setViewValue μ¬μ©μ λλλ‘ μΌλΆ ν¬λΌμμ $viewValueλ₯Ό μ§μ μ€μ νλ κ²μ μ νΈνμ¬ νΌνλ κ²½μ°κ° μμ΅λλ€.
λ€μλ μλν©λλ€.
ngModel.$viewValue = numbers; // Update the '$viewValue'
ngModel.$commitViewValue(); //update $$lastCommittedViewValue
ngModel.$render(); // Update the element's displayed value
μ¬κ· ν¨μ μ μ ν νΌνκ³ μΆλ€λ©΄ μΊ‘μν μλ°μ μ κ²½ μ°μ§ μλλ€λ©΄ $$lastCommittedViewValueλ₯Ό μ§μ μ λ°μ΄νΈν μ μμ΅λλ€. λΆννλ μ΄λ¬ν ν¨μμμ 무ν μ¬κ·κ° λ°μν λ μ΅λ λ°μ νμλ μ½μμ λ³΄κ³ λμ§ μλ κ²½μ°λ₯Ό 보μμ΅λλ€. ν μ€νΈ μ€μ μ€λ¨μ μ μ€μ νκ³ μ¬κ·λ₯Ό νμΈνλ λ° λͺ λΆ μ λ μκ°μ ν μ ν κ°μΉκ° μμ΅λλ€.
@gkalpak κ³Ό @snaptech μ€λͺ μ΄ κ²°ν©λμ΄ ν©κΈ μ루μ μ΄ λ©λλ€ :) :+1:
κ°μ₯ μ μ©ν λκΈ
$parsers
μ (μ¬λ³Έ)λ₯Ό λ³ννκΈ°μν κ²μ λλ€$viewValue
λ‘ "μ μ₯"νκΈ° μ μ$modelValue
(κ·Έλ¦¬κ³ κ·Έ κ·νμ μμ κ°νκ³ μλ κ²μ λλ€). μ€μ λ‘$viewValue
λ³κ²½νλ κ²μ μλλ―λ‘(μμμ κ°μ μ λ°μ΄νΈνμ§λ§) μκΈ°μΉ μμ λμμΌλ‘ μ΄μ΄μ§λλ€.μ΄κ²μ μλ₯Ό λ€μ΄ λ μ μ€λͺ λ©λλ€.
$modelValue
: μ μλμ§ μμ$viewValue
: 1element.val()
: 1$modelValue
: 1$viewValue
: 1element.val()
: 1$modelValue
: 1$viewValue
: 1xelement.val()
: 1x$modelValue
: 1$viewValue
: 1x(νμ fnμμ μ λ°μ΄νΈλμ§ μμ)element.val()
: 1(νμ fnμμ μ λ°μ΄νΈλ¨)$modelValue
: 1$viewValue
: 1x (μ΄μ $viewValue
λ1x
μμΌλ―λ‘ κ°μ§λ λ³κ²½ μ¬ν μμ)element.val()
: 1x$viewValue
μμ λ³κ²½ μ¬νμ΄ κ°μ§λμ§ μμμΌλ―λ‘) !!!$modelValue
: 1$viewValue
: 1xelement.val()
: 1x$modelValue
: 1$viewValue
: 1xxelement.val()
: 1xx$modelValue
: 1$viewValue
: 1xxelement.val()
: 1μ΄λ₯Ό μ μ νκ² μ²λ¦¬νλ λͺ κ°μ§ "κ°λ" λ°©λ²μ΄ μμ΅λλ€. μ:
μ λ°μ΄νΈλ ν
λͺ¨λ κ²μ΄ μμλλ‘ μλνλ κ² κ°μμ μ΄ κΈμ λ«μ΅λλ€.
@visnup , λͺ ννμ§ μμ μ¬νμ΄ μμΌλ©΄ μΈμ λ μ§ μ§λ¬Έμ λν νμ μ‘°μΉλ₯Ό μ·¨νμμμ€.