AngularJS中的DOM value与view value

在看AngularJS的文档的时候经常会见到三个名词:DOM value、view value和model value。

model value是模型值,view value是视图值,可这个DOM value是什么呢?

之前,我一直以为DOM value就是view value,他们两个是相同的。可是随着看的文档越来越多,我发现我越来越糊涂了:他们两个不是一样吗,为什么文档中一会儿DOM value,一会儿又是view value呢?

有了上面的疑问,所以就有了下面的内容。

废话不多说,看代码:

HTML代码:

<!DOCTYPE html>
<html lang="en" ng-app="restrictApp">
<head>
    <meta charset="UTF-8">
    <script src="js/angular.js"></script>
    <title>directive---测试</title>
</head>
<body>
<div ng-controller="testOne">
    {{title}}///{{testValue}}
    <div>
        <input first-directive type="text" ng-model="testValue" value="huaQ" />
    </div>
</div>
<script src="js/service.js"></script>
<script src="js/restrict.js"></script>
</body>
</html>

service.js

var testService = angular.module(‘testService‘,[]);
//使用factory注册
testService.factory(‘pageTitle‘,pageTitleFactory);
//下面是一个service factory function
function pageTitleFactory() {
    console.log(‘test service........‘);
    var title = {
        pageTitle:‘hello world‘
    };
    return title;
}
pageTitleFactory.$inject = [‘$rootScope‘];

restrict.js

var restrictApp = angular.module(‘restrictApp‘,[‘testService‘]);
restrictApp.directive(‘firstDirective‘, function ($timeout) {
    return {
        restrict: ‘A‘,
        require: ‘ngModel‘,
        link: function (scope, element, attrs, ctrl) {
            console.log(element[0].value);//DOM value -- huaQ
            console.log(ctrl.$viewValue);// view value -- NaN
            console.log(ctrl.$modelValue);// model value -- NaN
            console.log(ctrl);
            element.on(‘focus‘,function(e) {
                console.log(element[0].value);
                console.log(ctrl.$viewValue);// view value
                console.log(ctrl.$modelValue);// model value
            });
            element.on(‘blur‘,function(e) {
                element[0].value = ‘doulao‘;//DOM value
                console.log(element[0].value);
                console.log(ctrl.$viewValue);// view value
                console.log(ctrl.$modelValue);// model value
            });
        }
    };
});

restrictApp.controller(‘testOne‘,function($scope,pageTitle) {
    $scope.title = pageTitle.pageTitle;
    $scope.testValue = ‘Original‘;
});

在浏览器中运行上述代码,在控制台中查看输出结果,将看到以下有趣现象。

首先是编译指令,link函数中输出DOM value的值为‘huaQ‘,$viewValue和$modelValue的值都为NaN(不知道为什么是NaN)。(猜想:link函数在testOne控制器函数之前执行)

当input元素获得焦点时,控制台输出DOM value、$viewValue和$modelValue的值都为Original。

当input元素失去焦点时,控制台输出DOM value的值为doulao,$viewValue和$modelValue的值没有变,还是Original。为什么$viewValue和$modelValue没有与DOM value同步呢?因为在失去焦点事件函数中没有触发脏检测。

从这个例子可以很明显地看到DOM value与view value的不同。

原文地址:https://www.cnblogs.com/fogwind/p/8944835.html

时间: 2024-11-05 23:06:49

AngularJS中的DOM value与view value的相关文章

AngularJS中的DOM与事件

  前 言 AngularJS中的DOM与事件   AngularJS 为 HTML DOM 元素的属性提供了绑定应用数据的指令.  ng-disabled="true/false" 传入true表示禁用,传入false表示可用 代码: <label> <input type="checkbox" ng-model="myCheck" />是否同意 </label> <button ng-disabled

angularJS中的$apply(),$digest(),$watch()

$apply()和$digest()在AngularJS中是两个核心概念,但是有时候它们又让人困惑.而为了了解AngularJS的工作方式,首先需要了解$apply()和$digest()是如何工作的. $apply()和$digest() AngularJS提供了一个非常酷的特性叫做双向数据绑定(Two-way Data Binding),这个特性大大简化了我们的代码编写方式.数据绑定意味着当View中有任何数据发生了变化,那么这个变化也会自动地反馈到scope的数据上,也即意味着scope模

深入学习AngularJS中数据的双向绑定机制

来自:http://www.jb51.net/article/80454.htm Angular JS (Angular.JS) 是一组用来开发Web页面的框架.模板以及数据绑定和丰富UI组件.它支持整个开发进程,提供web应用的架构,无需进行手工DOM操作. AngularJS很小,只有60K,兼容主流浏览器,与 jQuery 配合良好.双向数据绑定可能是AngularJS最酷最实用的特性,将MVC的原理展现地淋漓尽致. AngularJS的工作原理是:HTML模板将会被浏览器解析到DOM中,

AngularJS开发指南11:AngularJS的model,controller,view详解

model model这个词在AngularJS中,既可以表示一个(比如,一个叫做phones的model,它的值是一个包含多个phone的数组)对象,也可以表示应用中的整个数据模型,这取决于我们所讨论的AngularJS文档中的上下文. 在AngularJS中,一个模型就是AngularJS作用域对象中的任何一个可取的属性.属性的名字就是模型的标示符.它的值可以是任意的Javascript对象(包括数组和原始对象). 将Javascript对象变成模型的唯一要求是这个对象必须是AngularJ

AngularJs中的directives(指令)

一.指令的职责   指令的职责是修改DOM结构,并将作用域和DOM连接起来.即指令既要操作DOM,将作用域内的数据绑定到DOM节点上,又要为DOM绑定事件调用作用域内的对应的方法. 二.创建自定义指令 调用自定义指令的4种方式:元素.属性.样式类.注释. 常用的是前两种,实例如下: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title>

黄聪:AngularJS中的$resource使用与Restful资源交互(转)

原文:http://blog.csdn.net/he90227/article/details/50525836 1.AngularJS中的 $resource 这个服务可以创建一个资源对象,我们可以用它非常方便地同支持RESTful的服务端数据源进行交互,当同支持RESTful的数据模型一起工作时,它就派上用场了.      REST是Representational State Transfer(表征状态转移)的缩写,是服务器用来智能化地提供数据服务的一种方式 1)我们首先需要引入ng-Re

Spring Boot+AngularJS中因为跨域导致Session丢失

http://blog.csdn.net/dalangzhonghangxing/article/details/52446821 如果还在为跨域问题烦恼,请查看博主的 解决angular+spring boot的跨域问题 那篇文章. 博主在项目开发过程中,遇到了由于跨域而导致的Session丢失问题,非常的恶心,但是经过在网上查阅各种资料,发现解决方法十分简单. 在我们每一次的数据请求中,浏览器都会向后台发送一个JSession,后台会根据这个值自动查找Id为JSession的那个sessio

AngularJs中,如何在父元素中调用子元素为自定义Directive中定义的函数?

最近一段时间准备使用AngularJs中的自定义Directive重构一下代码. 在这里说明一下,把自定义控件封装成Directive并不一定是要复用,而是要让代码结构更加清晰.就好像你将一个长方法拆分成多个独立的小方法,也未必要复用它们一样.职责独立等一票好处,会让后期维护更加轻松. 在重构的过程中,我遇到了这样一个问题,先上图: 图一: 这就是我要重构的界面,由于之前时间紧,将这三个Filter和两个button都写在了一个页面中.当时我已经预感到,如果将这里面的状态都写到一个scope上,

通过几段代码,理清angularJS中的$injector、$rootScope和$scope的概念和关联关系

$injector.$rootScope和$scope是angularJS框架中比较重要的东西,理清它们之间的关系,对我们后续学习和理解angularJS框架都非常有用. 1.$injector其实是一个IOC容器,包含了很多服务(类似于spring框架中的bean),其它代码能够通过       $injector.get("serviceName")的方式,从injector中获取所需要的服务.详情参考这篇文章 2.scope是angularJS中的作用域(其实就是存储数据的地方)