ngModel 포맷터 및 파서


103

같은 질문을 다른 형태로 게시했지만 아무도 대답하지 않았습니다. 포매터와 파서가 각도 js에서 수행하는 작업에 대한 명확한 그림을 얻지 못했습니다.

정의에 따르면 Formatters와 Parser는 모두 나와 비슷합니다. 이 angularjs를 처음 접했기 때문에 내가 틀렸을 수도 있습니다.

포맷터 정의

모델 값이 변경 될 때마다 파이프 라인으로 실행할 함수 배열입니다. 차례로 각 함수가 호출되어 값을 다음으로 전달합니다. 컨트롤 및 유효성 검사에 표시 할 값을 형식화 / 변환하는 데 사용됩니다.

파서 정의

컨트롤이 DOM에서 값을 읽을 때마다 파이프 라인으로 실행할 함수 배열입니다. 차례로 각 함수가 호출되어 값을 다음으로 전달합니다. 값 및 유효성 검사를 삭제 / 변환하는 데 사용됩니다. 유효성 검사를 위해 파서는 $ setValidity ()를 사용하여 유효성 상태를 업데이트하고 잘못된 값에 대해 undefined를 반환해야합니다.

간단한 예를 들어 두 기능을 이해하도록 도와주세요. 둘 다에 대한 간단한 설명을 주시면 감사하겠습니다.


2
포맷터 (123) 123-1234는 전화 번호 표시와 같이 모델의 표시 값을 수정합니다 . 파서는 변경 될 때마다 데이터를 읽고 일반적으로 입력의 $ valid 상태를 설정하는 데 사용됩니다. 문서에는 둘 다의 예가 있습니다.
km6zla 2014

답변:


155

이 주제는 관련 질문에서 정말 잘 다루었 습니다. AngularJS에서 양방향 필터링을 수행하는 방법?

요약:

  • 포맷터는 모델 값이 뷰에 표시되는 방식을 변경합니다.
  • 파서는 뷰 값이 모델에 저장되는 방식을 변경합니다.

다음은 NgModelController api 문서 의 예제를 기반으로하는 간단한 예제입니다 .

  //format text going to user (model to view)
  ngModel.$formatters.push(function(value) {
    return value.toUpperCase();
  });

  //format text from the user (view to model)
  ngModel.$parsers.push(function(value) {
    return value.toLowerCase();
  });

당신은 그것을 실제로 볼 수 있습니다 : http://plnkr.co/UQ5q5FxyBzIeEjRYYVGX?plnkr=legacy

<input type="button" value="set to 'misko'" ng-click="data.name='misko'"/>
<input type="button" value="set to 'MISKO'" ng-click="data.name='MISKO'"/>
<input changecase ng-model="data.name" />

(모델보기)에 이름을 입력하면 모델이 항상 소문자임을 알 수 있습니다. 그러나 버튼을 클릭하고 프로그래밍 방식으로 이름 (보려는 모델)을 변경하면 입력 필드는 항상 대문자입니다.


2
사용자가 입력 할 때이 변경 사항을 설정하는 방법이 있습니까? 당신은 "프로그램 상 '라고하지만 사용자가 서식 신용 카드 번호, 예를 들어, 입력에 입력으로 포맷 할 수있는 $ viewValue을 얻기 위해 노력하고 있어요
iamyojimbo

3
@SavvasNicholas 내가 착각하지 않았다면 ngModel.$setViewValue(transformedInput);그것을 설정 ngModel.$render();하고 $ parsers 함수에서 렌더링하는 데 사용합니다.
Jacob Ensor

제 경우에는 무엇을해야하는지 $formatters즉시 $validators. ; (
Mikhail Batcer 2015

1
참고로 참조 plunkr 더 이상 존재하지 않습니다
크리스 브라운 (Chris Brown)

1
필드에 이름을 입력하는 경우가 아니라 버튼을 누를 때만 포맷터가 작동합니다.
nuander

6

포맷터와 파서의 또 다른 사용법은 날짜를 UTC 시간으로 저장하고 입력시 현지 시간으로 표시하려는 경우 아래 datepicker 지시문과 utcToLocal 필터를 만들었습니다.

(function () {
    'use strict';

    angular
        .module('app')
        .directive('datepicker', Directive);

    function Directive($filter) {
        return {
            require: 'ngModel',
            link: function (scope, element, attr, ngModel) {
                element.addClass('datepicker');
                element.pickadate({ format: 'dd/mm/yyyy', editable: true });

                // convert utc date to local for display
                ngModel.$formatters.push(function (utcDate) {
                    if (!utcDate)
                        return;

                    return $filter('utcToLocal')(utcDate, 'dd/MM/yyyy');
                });

                // convert local date to utc for storage
                ngModel.$parsers.push(function (localDate) {
                    if (!localDate)
                        return;

                    return moment(localDate, 'DD/MM/YYYY').utc().toISOString();
                });
            }
        };
    }
})();

이 utcToLocal 필터를 사용하여 입력 날짜가 현지 시간으로 변환하기 전에 올바른 형식인지 확인합니다.

(function () {
    'use strict';

    angular
        .module('app')
        .filter('utcToLocal', Filter);

    function Filter($filter) {
        return function (utcDateString, format) {
            if (!utcDateString) {
                return;
            }

            // append 'Z' to the date string to indicate UTC time if the timezone isn't already specified
            if (utcDateString.indexOf('Z') === -1 && utcDateString.indexOf('+') === -1) {
                utcDateString += 'Z';
            }

            return $filter('date')(utcDateString, format);
        };
    }
})();

moment.js 는 현지 날짜를 utc 날짜로 변환하는 데 사용됩니다.

pickadate.js 는 사용되는 datepicker 플러그인입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.