首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >ngModel.$modelValue和ngModel.$viewValue有什么区别

ngModel.$modelValue和ngModel.$viewValue有什么区别
EN

Stack Overflow用户
提问于 2013-10-15 22:28:53
回答 3查看 49.3K关注 0票数 95

我有以下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);

我应该使用哪一个。我看了一下angular文档,它说:

$viewValue

Actual string value in the view.

$modelValue

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

我不知道作者在文档中写下这句话是什么意思:

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-10-15 23:01:31

您正在查看正确的文档,但可能只是您有点困惑。$modelValue$viewValue有一个明显的区别。它是这样的:

正如你已经在上面提到的:

视图中的

$viewValue:实际字符串(或对象)值。

$modelValue:控件绑定到的模型中的值。

我将假设您的ngModel引用的是<input />元素...?所以您的<input>有一个字符串值显示给用户,对吗?但实际的模型可能是该字符串的其他版本。例如,输入可能显示字符串'200',但<input type="number"> (例如)实际上将包含一个整数形式的模型值200。因此,您在<input>中“查看”的字符串表示是ngModel.$viewValue,而数字表示将是ngModel.$modelValue

另一个例子是<input type="date">,其中$viewValue将类似于Jan 01, 2000,而$modelValue将是表示该日期字符串的实际javascript Date对象。这有意义吗?

我希望这回答了你的问题。

票数 153
EN

Stack Overflow用户

发布于 2013-10-15 23:27:52

你可以看到类似这样的东西:

  • $modelValue是你的外部API,也就是说,暴露给你的controller.
  • $viewValue的东西是你的内部API,你应该只在内部使用它。

在编辑$viewValue时,render方法不会被调用,因为它是“呈现的模型”。您必须手动执行此操作,而渲染方法将在$modelValue修改时自动调用。

但是,由于有了$formatters$parsers,信息将保持一致:

  • 如果你更改$viewValue$parsers会将其转换回$modelValue.
  • If。如果更改了$viewValue$parsers会将其转换为$formatters
票数 27
EN

Stack Overflow用户

发布于 2013-10-15 23:24:22

Angular必须跟踪ngModel数据的两个视图--一个是DOM(浏览器)看到的数据,另一个是这些值的Angular处理表示。$viewValue是DOM端值。例如,在<input>中,$viewValue就是用户在浏览器中键入的内容。

一旦有人在<input>中输入了一些东西,$viewValue就会被$parsers处理,并转换成Angular的值视图,这就是$modelValue

因此,您可以认为$modelValue $viewValue 是angular处理后的值,也就是您在模型中看到的值,而是原始版本。

为了更进一步,假设我们做了一些改变$modelValue的事情。Angular看到了这一变化,并调用$formatters创建要发送到DOM的更新的$viewValue (基于新的$modelValue)。

票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19383812

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档