ngModel。$ modelValueとngModel。$ viewValueの違いは何ですか


94

次のckEditorディレクティブがあります。下部には、エディターでデータを設定する方法の例から見た2つのバリエーションがあります。

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そして$viewValue1つの明確な違いがあります。これです:

上記のとおり、

$viewValue:ビュー内の実際の文字列(またはオブジェクト)の値。
$modelValue:コントロールがバインドされているモデル内の値。

私はあなたのngModelが<input />要素を参照していると仮定します...?だからあなた<input>はそれがユーザーに表示する文字列値を持っていますよね?しかし、実際のモデルはその文字列の他のバージョンである可能性があります。たとえば、入力に文字列'200'が表示される場合がありますが、<input type="number">実際には(たとえば)には200整数のモデル値が含まれます。したがって、「表示」する文字列表現<input>はでngModel.$viewValueあり、数値表現はになりngModel.$modelValueます。

別の例は<input type="date">$viewValueがのようなものでJan 01, 2000あり、$modelValueDateその日付文字列を表す実際のJavaScript オブジェクトです。それは理にかなっていますか?

それがあなたの質問に答えることを願っています。


基本的に、$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 changeに変換し、レンダリングモデルは$ modelValueの変更時に自動的に呼び出されます。間接的に、 $ viewValueが変更されると、renderメソッドが呼び出されます。それは...ですか ?
ムクンドクマール2014

1
これがどのように機能するかを理解するには、Angular ngModel双方向バインディングパイプラインを掘り下げる必要があります。メソッド$viewValueを介して更新する場合 setViewValue(viewValue)、パーサー/バリデーターは(存在する場合)viewValueキックインし、それをモデル値に解析して検証し、スコープに書き込んでからをキックしviewChangeListenersます。次にダイジェストを実行すると、モデルの値がスコープから取得され、コントローラーの$ modelValueと比較されます:github.com/angular/angular.js/blob/master/src/ng/directive/…。それらが等しい場合(そしてそれらはシナリオで等しくなります)、それは戻ります。
demisx 2015

18

AngularはngModelデータの2つのビューを追跡する必要があります-DOM(ブラウザ)によって見られるようなデータがあり、それらの値のAngularの処理された表現があります。$viewValueDOM側の値です。したがって、たとえば、中にユーザーがブラウザに入力した内容です。 <input>$viewValue

誰かの種類が何かしたら<input>、その後は$viewValue$パーサによって処理され、呼び出された値の角度のビューになっています$modelValue

したがって$modelValue、angularが処理した値のバージョンであると考えることができます$viewValue。モデルに表示される値は、生のバージョンです。

この一歩を踏み出すために、私たちがを変える何かをすることを想像してみてください$modelValue。Angularはこの変更を認識し、$ formattersを呼び出し$viewValueて、DOMに送信される更新された(新しい$ modelValueに基づいて)を作成します。


$ modelValueまたは$ modelViewを意味しますか?$ modelValueの場合は、タイプミスを修正してください。
プランクトン2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.