AngularJS的数据双向绑定是怎么jquery实现数据绑定的

本文讲的是AngularJS
双向数据绑定详解简单实例_AngularJS,
angular的双向数据绑定,个人理解是,通过model建立数据模型,那么视图上的数据就会对应存储在angular程序里,视图上的数据变化会同步到model,model的数据改变也会同步到视图。
下面的demo演示:
angular的双向数据绑定,个人理解是,通过model建立数据模型,那么视图上的数据就会对应存储在angular程序里,视图上的数据变化会同步到model,model的数据改变也会同步到视图。
下面的demo演示:
&!DOCTYPE html&
&html lang="en"&
&meta charset="UTF-8"&
&title&hello, AngularJS!&/title&
&script src="angular.js"&&/script&
&div ng-app&
&!-- ng-model指令将表单的value绑定到model的username变量--&
&input ng-model="username" type="text" placeholder="请输入..."&
&p&Hello, &strong&{{username}}&/strong&!&/p&
运行结果:程序运行后,在输入框输入文字,下面会与输入框内容同步变化。是不是很惊奇!以前需要写一大段js代码的事情(监听onchange事件,将input的value赋给下面的strong元素),现在只用一个ng-model指令就完成了。Perferct!
案例详解:
1. ng-model指令的作用:建立数据模型,在模型中对应有一个变量username用来存放input元素的value;
2. {{username}}是一个表达式,angular会自动该表达式,替换成相应的值。
3. 手动输入文字,input元素的value发生变化,自动同步到model的usename变量,{{username}}是从模型中读username的值,因此下面strong元素的内容跟着变了。
同步数据是angular帮我们完成的。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
以上是云栖社区小编为您精心准备的的内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索angularjs
双向数据绑定
angularjs简单实例、angularjs 双向绑定、angularjs2 双向绑定、angularjs的双向绑定、angularjs 指令详解,以便于您获取更多的相关知识。
弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率
稳定可靠、可弹性伸缩的在线数据库服务,全球最受欢迎的开源数据库之一
6款热门基础云产品6个月免费体验;2款产品1年体验;1款产品2年体验
开发者常用软件,超百款实用软件一站式提供
云栖社区()为您免费提供相关信息,包括
的信息,还有angularjs简单实例、angularjs 双向绑定、angularjs2 双向绑定、angularjs的双向绑定、angularjs 指令详解等
,所有相关内容均不代表云栖社区的意见!更多频道内容在这里查看
爱奇艺用户将能永久保存播放记录
过滤短视频
暂无长视频(电视剧、纪录片、动漫、综艺、电影)播放记录,
使用您的微博帐号登录,即刻尊享微博用户专属服务。
使用您的QQ帐号登录,即刻尊享QQ用户专属服务。
使用您的人人帐号登录,即刻尊享人人用户专属服务。
按住视频可进行拖动
&正在加载...
请选择打赏金额:
收藏成功,可进入
查看所有收藏列表
当前浏览器仅支持手动复制代码
视频地址:
flash地址:
html代码:
通用代码:
通用代码可同时支持电脑和移动设备的分享播放
用爱奇艺APP或微信扫一扫,在手机上继续观看
当前播放时间:
一键下载至手机
限爱奇艺安卓6.0以上版本
使用微信扫一扫,扫描左侧二维码,下载爱奇艺移动APP
其他安装方式:手机浏览器输入短链接http://71.am/udn
下载安装包到本机:
设备搜寻中...
请确保您要连接的设备(仅限安卓)登录了同一爱奇艺账号 且安装并开启不低于V6.0以上版本的爱奇艺客户端
连接失败!
请确保您要连接的设备(仅限安卓)登录了同一爱奇艺账号 且安装并开启不低于V6.0以上版本的爱奇艺客户端
部安卓(Android)设备,请点击进行选择
请您在手机端下载爱奇艺移动APP(仅支持安卓客户端)
使用微信扫一扫,下载爱奇艺移动APP
其他安装方式:手机浏览器输入短链接http://71.am/udn
下载安装包到本机:
爱奇艺云推送
请您在手机端登录爱奇艺移动APP(仅支持安卓客户端)
使用微信扫一扫,下载爱奇艺移动APP
180秒后更新
打开爱奇艺移动APP,点击“我的-扫一扫”,扫描左侧二维码进行登录
没有安装爱奇艺视频最新客户端?
30秒后自动关闭
后盾向军AngularJS开发宝典之ng-model在表单中双向绑定实例分">后盾向军AngularJS开发宝典之ng-model在表单中双向绑定实例分
播放量数据:快去看看谁在和你一起看视频吧~
您使用浏览器不支持直接复制的功能,建议您使用Ctrl+C或右键全选进行地址复制
安装爱奇艺视频客户端,
马上开始为您下载本片
5秒后自动消失
&li data-elem="tabtitle" data-seq="{{seq}}"& &a href="javascript:void(0);"& &span>{{start}}-{{end}}&/span& &/a& &/li&
&li data-downloadSelect-elem="item" data-downloadSelect-selected="false" data-downloadSelect-tvid="{{tvid}}"& &a href="javascript:void(0);"&{{pd}}&/a&
选择您要下载的《
色情低俗内容
血腥暴力内容
广告或欺诈内容
侵犯了我的权力
还可以输入
您使用浏览器不支持直接复制的功能,建议您使用Ctrl+C或右键全选进行地址复制AngularJS 作用域与数据绑定机制
AngularJS 简介AngularJS 是由 Google 发起的一款开源的前端 MVC 脚本框架,既适合做普通 WEB 应用也可以做 SPA(单页面应用,所有的用户操作都在一个页面中完成)。与同为 MVC 框架的 Dojo 的定位不同,AngularJS 在功能上更加轻量,而相比于 jQuery,AngularJS 又帮您省去了许多机械的绑定工作。在一些对开发速度要求高,功能模块不需要太丰富的非企业级 WEB 应用上,AngularJS 是一个非常好的选择。AngularJS 最为复杂同时也是最强大的部分就是它的数据绑定机制,这个机制帮助我们能更好的将注意力集中在数据的模型建立和传递上,而不是对底层的 DOM 进行低级的操作。AngularJS 作用域基于 jQuery 的传统 WEB 应用中,为了监听用户的输入等行为,需要为每一个 DOM 元素设置一个监听方法,也即是监听 DOM 上发生的各类事件,然后由 jQuery 做出回应并展示在页面上。这种方法简便直观,但是一旦 WEB 应用变得庞大而且复杂,那么监听代码就显得非常的机械而且冗余,更可怕的是,如果对于 DOM 的事件监听没有做好管理,那么很容易出现浏览器资源的泄露。针对以上所暴露的问题,AngularJS 用一系列指令来代替 jQuery 的事件绑定代码。为了能够组织好各类指令之间的协调工作而不出现数据混乱,AngularJS 在模型层上引申出作用域的概念,以配合控制器来实现对视图层的展现工作。作用域(Scope)AngularJS 中,作用域是一个指向应用模型的对象,它是表达式的执行环境。作用域有层次结构,这个层次和相应的 DOM 几乎是一样的。作用域能监控表达式和传递事件。在 HTML 代码中,一旦一个 ng-app 指令被定义,那么一个作用域就产生了,由 ng-app 所生成的作用域比较特殊,它是一个根作用域($rootScope),它是其他所有$Scope 的最顶层。清单 1. 生成根作用域&html&
&head&&script src="angular.min.js"&&/script&&/head&
&body data-ng-app="app"&...&/body&
&/html&除了用 ng-app 指令可以产生一个作用域之外,其他的指令如 ng-controller,ng-repeat 等都会产生一个或者多个作用域。此外,还可以通过 AngularJS 提供的创建作用域的工厂方法来创建一个作用域。这些作用域都拥有自己的继承上下文,并且根作用域都为$rootScope。在生成一个作用域之后,在编写 AngularJS 代码时,$scope 对象就代表了这个作用域的数据实体,我们可以在$scope 内定义各种数据类型,之后可以直接在 HTML 中以 {{变量名}} 方式来让 HTML 访问到这个变量,代码如下:清单 2. 简单的数据绑定&script&
angular.module('app', [])
.controller("ctrl", function ($scope) {
$scope.btns = {
ibm : 'ibm'
&body data-ng-app="app" &
&div data-ng-controller="ctrl"&
&button&{{btns.ibm}}&/button&
&/body&这就是 AngularJS 中最简单的数据绑定方式,同时也是应用最为广泛的数据绑定方式。继承作用域(Inherited Scope)AngularJS 在创建一个作用域时,会检索上下文,如果上下文中已经存在一个作用域,那么这个新创建的作用域就会以 JavaScript 原型继承机制继承其父作用域的属性和方法(有个例外是孤立作用域,下文讨论)。一些 AngularJS 指令会创建新的子作用域,并且进行原型继承: ng-repeat、ng-include、ng-switch、ng-view、ng-controller,
用 scope: true 和 transclude: true 创建的 directive。以下 HTML 中定义了三个作用域,分别是由 ng-app 指令所创建的$rootScope,parentCtrl 和 childCtrl 所创建的子作用域,这其中 childCtrl 生成的作用域又是 parentCtrl 的子作用域。清单 3. 作用域的继承实例&body data-ng-app="app"&
&div data-ng-controller="parentCtrl"&
&input data-ng-model="args"&
&div data-ng-controller="childCtrl"&
&input data-ng-model="args"&
&/body&继承作用域符合 JavaScript 的原型继承机制,这意味着如果我们在子作用域中访问一个父作用域中定义的属性,JavaScript 首先在子作用域中寻找该属性,没找到再从原型链上的父作用域中寻找,如果还没找到会再往上一级原型链的父作用域寻找。在 AngularJS 中,作用域原型链的顶端是$rootScope,AnguarJS 将会寻找到$rootScope 为止,如果还是找不到,则会返回 undefined。我们用实例代码说明下这个机制。首先,我们探讨下对于原型数据类型的作用域继承机制:清单 4. 作用域继承实例-原始类型数据继承&script type="text/javascript"&
angular.module('app', [])
.controller('parentCtrl', ['$scope', function($scope) {
$scope.args = 'IBM DeveloperWorks';
.controller('childCtrl', ['$scope', function($scope) {
&body data-ng-app="app"&
&div data-ng-controller="parentCtrl"&
&input data-ng-model="args"&
&div data-ng-controller="childCtrl"&
&input data-ng-model="args"&
&/body&运行页面,我们得到以下的结果:图 1. 页面运行结果。这个结果我们非常好理解,虽然在 childCtrl 中没有定义具体的 args 属性,但是因为 childCtrl 的作用域继承自 parentCtrl 的作用域,因此,AngularJS 会找到父作用域中的 args 属性并设置到输入框中。而且,如果我们在第一个输入框中改变内容,内容将会同步的反应到第二个输入框:图 2. 改变第一个输入框的内容后页面运行结果假如我们修改第二个输入框的内容,此时会发生什么事情呢?答案是第二个输入框的内容从此将不再和第一个输入框的内容保持同步。在改变第二个输入框的内容时,因为 HTML 代码中 model 明确绑定在 childCtrl 的作用域中,因此 AngularJS 会为 childCtrl 生成一个 args 原始类型属性。这样,根据 AngularJS 作用域继承原型机制,childCtrl 在自己的作用域找得到 args 这个属性,从而也不再会去寻找 parentCtrl 的 args 属性。从此,两个输入框的内容所绑定的属性已经是两份不同的实例,因此不会再保持同步。图 3. 改变第二个输入框的内容后页面运行结果假如我们将代码做如下修改,结合以上两个场景,思考下会出现怎样的结果?清单 5. 作用域继承实例-对象数据继承&script type="text/javascript"&
angular.module('app', [])
.controller('parentCtrl', ['$scope', function($scope) {
$scope.args = {};
$scope.args.content = 'IBM DeveloperWorks';
.controller('childCtrl', ['$scope', function($scope) {
&body data-ng-app="app"&
&div data-ng-controller="parentCtrl"&
&input data-ng-model="args.content"&
&div data-ng-controller="childCtrl"&
&input data-ng-model="args.content"&
&/body&答案是无论改变任何一个输入框的内容,两者的内容始终同步。根据 AngularJS 的原型继承机制,如果 ng-model 绑定的是一个对象数据,那么 AngularJS 将不会为 childCtrl 创建一个 args 的对象,自然也不会有 args.content 属性。这样,childCtrl 作用域中将始终不会存在 args.content 属性,只能从父作用域中寻找,也即是两个输入框的的变化其实只是在改变 parentCtrl 作用域中的 args.content 属性。因此,两者的内容始终保持同步。我们再看一个例子,这次请读者自行分析结果。清单 6. 作用域继承实例-不再访问父作用域的数据对象。&script type="text/javascript"&
angular.module('app', [])
.controller('parentCtrl', ['$scope', function($scope) {
$scope.args = {};
$scope.args.content = 'IBM DeveloperWorks';
.controller('childCtrl', ['$scope', function($scope) {
$scope.args = {};
$scope.args.content = 'IBM DeveloperWorks';
&body data-ng-app="app"&
&div data-ng-controller="parentCtrl"&
&input data-ng-model="args.content"&
&div data-ng-controller="childCtrl"&
&input data-ng-model="args.content"&
&/body&答案是两个输入框的内容永远不会同步。孤立作用域(Isolate Scope)孤立作用域是 AngularJS 中一个非常特殊的作用域,它只在 directive 中出现。在对 directive 的定义中,我们添加上一个 scope:{} 属性,就为这个 directive 创建出了一个隔离作用域。清单 7. directive 创建出一个孤立作用域angular.module('isolate', []).directive("isolate", function () {
scope : {},
})孤立作用域最大的特点是不会原型继承其父作用域,对外界的父作用域保持相对的独立。因此,如果在定义了孤立作用域的 AngularJS
directive 中想要访问其父作用域的属性,则得到的值为 undefined。代码如下:清单 8. 孤立作用域的隔离性&script type="text/javascript"&
angular.module('app', [])
.controller('ctrl', ['$scope', function($scope) {
$scope.args = {};
.directive("isolateDirective", function () {
scope : {},
link : function($scope, $element, $attr) {
console.log($scope.$args); //输出 undefined
&body data-ng-app="app"&
&div data-ng-controller="ctrl"&
&div data-isolate-directive&&/div&
&/body&上面的代码中通过在 directive 中声明了 scope 属性从而创建了一个作用域,其父作用域为 ctrl 所属的作用域。但是,这个作用域是孤立的,因此,它访问不到父作用域的中的任何属性。存在这样设计机制的好处是:能够创建出一些列可复用的 directive,这些 directive 不会相互在拥有的属性值上产生串扰,也不会产生任何副作用。AngularJS 孤立作用域的数据绑定在继承作用域中,我们可以选择子作用域直接操作父作用域数据来实现父子作用域的通信,而在孤立作用域中,子作用域不能直接访问和修改父作用域的属性和值。为了能够使孤立作用域也能和外界通信,AngularJS 提供了三种方式用来打破孤立作用域“孤立”这一限制。单向绑定(@ 或者 @attr)这是 AngularJS 孤立作用域与外界父作用域进行数据通信中最简单的一种,绑定的对象只能是父作用域中的字符串值,并且为单向只读引用,无法对父作用域中的字符串值进行修改,此外,这个字符串还必须在父作用域的 HTML 节点中以 attr(属性)的方式声明。使用这种绑定方式时,需要在 directive 的 scope 属性中明确指定引用父作用域中的 HTML 字符串属性,否则会抛异常。示例代码如下:清单 9. 单向绑定示例&script&
angular.module('isolateScope', [])
.directive("isolateDirective", function () {
replace : true,
template: '&button&{{isolates}}&/button&',
isolates : '@',
link : function($scope, $element, $attr) {
$scope.isolates = "DeveloperWorks";
.controller("ctrl", function ($scope) {
$scope.btns = 'IBM';
&body data-ng-app="isolateScope" &
&div data-ng-controller="ctrl"&
&button&{{btns}}&/button&
&div data-isolate-directive data-isolates="{{btns}}"&&/div&
&/body&简单分析下上面的代码,通过在 directive 中声明了 scope:{isolates:'@'} 使得 directive 拥有了父作用域中 data-isolates 这个 HTML 属性所拥有的值,这个值在控制器 ctrl 中被赋值为'IBM'。所以,代码的运行结果是页面上有两个名为 IBM 的按钮。我们还注意到 link 函数中对 isolates 进行了修改,但是最终不会在运行结果中体现。这是因为 isolates 始终绑定为父作用域中的 btns 字符串,如果父作用域中的 btns 不改变,那么在孤立作用域中无论怎么修改 isolates 都不会起作用。引用绑定(&或者&attr)通过这种形式的绑定,孤立作用域将有能力访问到父作用域中的函数对象,从而能够执行父作用域中的函数来获取某些结果。这种方式的绑定跟单向绑定一样,只能以只读的方式访问父作用函数,并且这个函数的定义必须写在父作用域 HTML 中的 attr(属性)节点上。这种方式的绑定虽然无法修改父作用域的 attr 所设定的函数对象,但是却可以通过执行函数来改变父作用域中某些属性的值,来达到一些预期的效果。示例代码如下:清单 10. 引用绑定示例&script&
angular.module('isolateScope', [])
.directive("isolateDirective", function () {
replace : true,
isolates : '&',
link : function($scope, $element, $attr) {
var func = $scope.isolates();
.controller("ctrl", function ($scope) {
$scope.func = function () {
console.log("IBM DeveloperWorks");
&body data-ng-app="isolateScope" &
&div data-ng-controller="ctrl"&
&div data-isolate-directive data-isolates="func"&&/div&
&/body&这个例子中,浏览器的控制台将会输出一段“IBM DeveloperWorks”文字。上面的代码中我们在父作用域中指定了一个函数对象$scope.func,在孤立作用域中通过对 HTML 属性的绑定从而引用了 func。需要注意的是 link 函数中对 func 对象的使用方法,$scope.isolates 获得的仅仅是函数对象,而不是调用这个对象,因此我们需要在调用完$scope.isolates 之后再调用这个函数,才能得到真正的执行结果。双向绑定(=或者=attr)双向绑定赋予 AngularJS 孤立作用域与外界最为自由的双向数据通信功能。在双向绑定模式下,孤立作用域能够直接读写父作用域中的属性和数据。和以上两种孤立作用域定义数据绑定一样,双向绑定也必须在父作用域的 HTML 中设定属性节点来绑定。双向绑定非常适用于一些子 directive 需要频繁和父作用域进行数据交互,并且数据比较复杂的场景。不过,由于可以自由的读写父作用域中的属性和对象,所以在一些多个 directive 共享父作用域数据的场景下需要小心使用,很容易引起数据上的混乱。示例代码如下:清单 11. 双向绑定示例&script&
angular.module('isolateScope', [])
.directive("isolateDirective", function () {
replace : true,
template: '&button&{{isolates}}&/button&',
isolates : '=',
link : function($scope, $element, $attr) {
$scope.isolates.ibm = "IBM";
.controller("ctrl", function ($scope) {
$scope.btns = {
ibm : 'ibm',
dw : 'DeveloperWorks'
&body data-ng-app="isolateScope" &
&div data-ng-controller="ctrl"&
&button&{{btns.dw}}&/button&
&button&{{btns.ibm}}&/button&
&div data-isolate-directive data-isolates="btns"&&/div&
&/body&上面的代码运行的结果是浏览器页面上出现三个按钮,其中第一个按钮标题为“DeveloperWorks”,第二和第三个按钮的标题为“IBM”。初始时父作用域中的$scope.btns.ibm 为小写的“ibm”,通过双向绑定,孤立作用域中将父作用域的 ibm 改写成为大写的“IBM”并且直接生效,父作用域的值被更改。总结由于 AngularJS 框架的轻量性和其清晰的 MVC 特点使得其在推出之后就大受欢迎,实践中也很容易上手。AngularJS 比较难以掌握和理解的就是其作用域和绑定机制,本文重点将作用域和绑定机制做了分析与讨论,希望读者能够理解并熟练掌握这块内容。
相关主题参考了解更多关于作用域的介绍参考了解更多关于作用域和数据绑定的中文介绍参考中国了解更多其他关于 AngularJS 的文章:查找丰富的操作信息、工具和项目更新,帮助您掌握开源技术并将其用于 IBM 产品。
添加或订阅评论,请先或。
有新评论时提醒我
static.content.url=/developerworks/js/artrating/SITE_ID=10Zone=Open source, Web developmentArticleID=1004048ArticleTitle=AngularJS 作用域与数据绑定机制publish-date=angularJs对数据双向绑定_angularjs 双向绑定_词汇网
<meta name="keywords" content="angularJs对数据双向绑定angularjs 双向绑定,ng-modell指令对数据双向绑定
代码片段(1)[," />
angularJs对数据双向绑定
责任编辑:词汇网 发表时间: 11:14:24
ng-modell指令对数据双向绑定 标签:
代码片段(1)[全屏查看所有代码] 1.[代码][其他]代码
请输入任意值: 你输入的为: {{ name }}
上一集:没有了 下一集:
相关文章:&&&&&&&&&&
最新添加资讯
24小时热门资讯
附近好友搜索

我要回帖

更多关于 jq实现双向数据绑定 的文章

 

随机推荐