ngModel. $ modelValue와 ngModel. $ viewValue의 차이점은 무엇입니까?


94

다음 ckEditor 지시문이 있습니다. 하단에는 편집기에서 데이터를 설정하는 방법에 대한 예제에서 본 두 가지 변형이 있습니다.

app.directive('ckEditor', [function () {
    return {
        require: '?ngModel',
        link: function ($scope, elm, attr, ngModel) {

            var ck = null;
            var config = attr.editorSize;
            if (config == 'wide') {
                ck = CKEDITOR.replace(elm[0], { customConfig: 'config-wide.js' });
            } else {
                ck = CKEDITOR.replace(elm[0], { customConfig: 'config-narrow.js' });
            }


            function updateModel() {
                $scope.$apply(function () {
                    ngModel.$setViewValue(ck.getData());
                });
            }

            $scope.$on('modalObjectSet', function (e, modalData) {
                // force a call to render
                ngModel.$render();
            });

            ck.on('change', updateModel);
            ck.on('mode', updateModel);
            ck.on('key', updateModel);
            ck.on('dataReady', updateModel);

            ck.on('instanceReady', function () {
                ngModel.$render();
            });

            ck.on('insertElement', function () {
                setTimeout(function () {
                    $scope.$apply(function () {
                        ngModel.$setViewValue(ck.getData());
                    });
                }, 1000);
            });

            ngModel.$render = function (value) {
                ck.setData(ngModel.$modelValue);
            };

            ngModel.$render = function (value) {
                ck.setData(ngModel.$viewValue);
            };
        }
    };
}])

누군가가 다음의 차이점을 말해 줄 수 있습니까?

ck.setData(ngModel.$modelValue);
ck.setData(ngModel.$viewValue);

그리고 어느 것을 사용해야합니다. 각도 문서를 살펴보면 다음과 같이 표시됩니다.

$viewValue

Actual string value in the view.

$modelValue

The value in the model, that the control is bound to.

나는 저자가 문서에서 이것을 썼을 때 무엇을 의미했는지 전혀 모른다 :-(

답변:


151

올바른 문서를보고 있지만 약간 혼란 스러울 수 있습니다. $modelValue$viewValue하나 개의 뚜렷한 차이가있다. 이것은 :

위에서 이미 언급했듯이 :

$viewValue:보기의 실제 문자열 (또는 개체) 값입니다.
$modelValue:컨트롤이 바인딩 된 모델의 값입니다.

ngModel이 <input />요소를 참조한다고 가정하겠습니다 ...? 따라서 사용자 <input>에게 표시되는 문자열 값이 있습니다. 그러나 실제 모델은 해당 문자열의 다른 버전 일 수 있습니다. 예를 들어 입력은 문자열을 표시 할 수 '200'있지만 <input type="number">(예를 들어) 실제로는 모델 값을 200정수로 포함합니다 . 따라서 "보기"에서 문자열 표현 <input>ngModel.$viewValue이고 숫자 표현은 ngModel.$modelValue.

또 다른 예 는가 있는 <input type="date">곳 과 해당 날짜 문자열을 나타내는 실제 자바 스크립트 객체입니다. 말이 돼?$viewValueJan 01, 2000$modelValueDate

귀하의 질문에 대한 답변이 되었기를 바랍니다.


그래서 기본적으로 $viewValue항상 문자열입니까?
cdmckay 2014 년

7
문서에서 말했듯이 : $viewValue: Actual string value in the view.. 네.
tennisgent

7
또 다른 메모. 때 <input type="text">값이 비어의 $modelValue속성입니다 undefined(가) 반면에, $viewValue이다 ''빈 문자열. $modelValue작동하지 않지만 작동 하는 "길이"를 스니핑하면 차이를 만들 수 있습니다 $viewValue.
BradGreens 2014 년

8
$viewValue항상 문자열이 아닌. 현재 Angular 핵심 지시문의 문자열이지만 사용자 지정 컨트롤의 기본 또는 개체 일 수 있습니다. 좋은 예는 <input file="type">구성 요소입니다. 여기서 viewValue에는 FileList사용자가 첨부 한 파일 이있는 개체가 포함 됩니다. Angular 문서는 현재 이것에 대해 혼란스럽고 업데이트되어야합니다.
demisx

4
또한 입력이 유효하지 않으면 $ modelValue가 설정되지 않습니다. 즉, <input ng-minlength = "8"...>이 있고 입력 한 길이가 5자인 경우 $ viewValue는 해당 5자를 표시하지만 $ modelValue는 존재하지 않습니다.
honkskillet

27

다음과 같은 것을 볼 수 있습니다.

  • $modelValue 즉, 컨트롤러에 노출되는 외부 API입니다.
  • $viewValue 내부 API이므로 내부적으로 만 사용해야합니다.

을 편집 할 때 $viewValue"렌더링 된 모델"이기 때문에 render 메서드가 호출되지 않습니다. 수동으로 수행해야하는 반면 렌더링 방법은 $modelValue수정 시 자동으로 호출됩니다 .

그러나, 정보, 덕분에 일관성을 유지합니다 $formatters$parsers:

  • 당신이 변경하는 경우 $viewValue, $parsers그것은으로 다시 변환합니다 $modelValue.
  • 당신이 변경하는 경우 $modelValue, $formatters로 변환됩니다 $viewValue.

$ viewValue를 편집 할 때 render 메서드가 호출되지 않습니다. $ viewValue를 변경하면 $ parsers가 다시 $ modelValue.means $ modelvalue 변경으로 변환하고 $ modelValue 수정시 자동으로 렌더링 메서드가 호출됩니다. $ viewValue가 변경되면 render 메서드가 호출됩니다. 맞나요?
Mukund Kumar 2014

1
이것이 어떻게 작동하는지 이해하려면 Angular ngModel 양방향 바인딩 파이프 라인을 파헤쳐 야합니다. 메서드 $viewValue를 통해 업데이트 할 때 setViewValue(viewValue)파서 / 유효성 검사기가 시작 (있는 경우)하고 viewValue이를 modelValue로 구문 분석하고 , 유효성을 검사하고, 범위에 기록한 다음 viewChangeListeners. 다음에 다이제스트가 실행되면 범위에서 모델 값이 검색되고 컨트롤러의 $ modelValue와 비교됩니다. github.com/angular/angular.js/blob/master/src/ng/directive/… . 같으면 (그리고 시나리오에서 같을 것입니다) 반환됩니다.
demisx

18

Angular는 ngModel 데이터의 두 가지 뷰를 추적해야합니다. DOM (브라우저)에서 볼 수있는 데이터가 있고 해당 값에 대한 Angular의 처리 된 표현이 있습니다. 이것은 $viewValueDOM 측 값입니다. 따라서, 예를 들어,에 <input>$viewValue사용자가 브라우저에 입력 한 내용입니다.

누군가 유형은 무엇인가되면 <input>그 다음은 $viewValue$ 파서에 의해 처리 및 호출되는 값의 각도의 관점으로 전환됩니다 $modelValue.

따라서 $modelValue앵귤러의 처리 된 값인 모델에서 볼 수있는 값인 반면 $viewValue원시 버전 이라고 생각할 수 있습니다 .

이것을 한 단계 더 나아 가기 위해 우리가 $modelValue. Angular는이 변경 사항을 확인하고 $ formatters를 호출 $viewValue하여 DOM으로 보낼 업데이트 된 (새 $ modelValue 기반) 을 만듭니다 .


u는 $ modelValue 또는 $ modelView를 의미합니까? $ modelValue이면 오타를 정정하십시오.
Plankton
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.