Angularjs中三种数据的绑定策略(“@”,“=”,“&”)


Posted in Javascript onDecember 23, 2016

前言

我们想要实现这样的效果:当我们点击标题的时候展示下面的内容,再点击则收回去。

Angularjs中三种数据的绑定策略(“@”,“=”,“&”)

一、首先回顾一下有哪些绑定策略?

Angularjs中三种数据的绑定策略(“@”,“=”,“&”)

看这个实在是有点抽象了,我们来看具体的实例分析吧!

二、简单的Demo实例

@绑定:传递一个字符串作为属性的值。

比如 str : ‘@string'

控制器中代码部分示例:

myDirec.controller('MyCtrl3',['$scope',function($scope){
 $scope.ctrlFlavor="鸡尾酒";
 
 $scope.sayHello=function(name){
 alert("Hello "+name);
 };
 
}]);

myDirec.directive("drink",function(){
 return{
  restrict:'AE',
  scope:{
  flavor:'@' //自动绑定,传递的是字符串
  },
  template:"<div>{{flavor}}</div>",
 };
});

页面中使用标签部分示例:

<div ng-controller="MyCtrl3">
 <drink flavor="{{ctrlFlavor}}"></drink>
 </div>

分析我们在drink指令中为什么能取得在父作用域中的值呢?原因就在于我们使用了@绑定策略,可以将ctrlFlavor赋值给flavor,这样在模板中就能取到该值了。

=绑定:指定获取属性的类型为父作用域的属性

myDirec.directive("drink2",function(){
 return{
 restrict:'AE',
 scope:{
  flavor:'=' //自动绑定
 },
 template:'<input type="text" ng-model="flavor"/>'
 };
});

页面:

<div ng-controller="MyCtrl3">
 <drink2 flavor="ctrlFlavor"></drink2>
 </div>

执行的流程是这样的:

① 指令被编译的时候会扫描到template中的模型发现有一个flavor,

② 查找scope中是否定义:通过=与父作用域绑定,方式是传递父作用域中的属性ctrlFlavor;

③ flavor与父作用域中的ctrlFlavor属性绑定,找到它的值“鸡尾酒”;

④ 将model的值显示在模板中。

&绑定:传递的是父作用域中的函数

控制器部分:

myDirec.directive("greeting", function() {
 return {
 restrict:'AE',
 scope:{
  greet:'&'
 },
 template:'<input type="text" ng-model="userName" /><br/>'+
   '<button ng-click="greet({name:userName})">问候一下</button><br/>'
 };
});

页面部分:

<div ng-controller="MyCtrl3">
  <greeting greet="sayHello(name)"></greeting>
  <greeting greet="sayHello(name)"></greeting>
  <greeting greet="sayHello(name)"></greeting>
</div>

从结果上看,三个输入框中的内容互不影响,因为都是新的独立作用域,能够完成从视图到模型的绑定。

三、Expander示例

首先看控制器代码:

/*Expander示例*/
myDirec.controller('SomeController',function($scope) {
 $scope.title = '点击展开';
 $scope.text = '这里是内部的显示的内容';
});

myDirec.directive('expander', function() {
 return {
 restrict : 'EA',
 replace : true,
 transclude : true,
 scope : {
  title : '=expanderTitle'
 },
 template : '<div>'
   + '<div class="title" ng-click="toggle()">{{title}}</div>'
   + '<div class="body" ng-show="showMe" ng-transclude></div>'
   + '</div>',
 link : function(scope, element, attrs) {
  scope.showMe = false;
  scope.toggle = function() {
  scope.showMe = !scope.showMe;
  };
 }
 };
});

再看页面部分:

<div ng-controller='SomeController'>
 <expander class='expander' expander-title='title'> {{text}} </expander>
 </div>

执行的流程是这样的:

① 指令被编译的时候会扫描到template中的模型发现有一个{{title}},

② 查找scope中是否定义:通过=与父作用域绑定,方式是传递父作用域中的属性;

我总是在这里犯糊涂,解释下这个“方式是传递父作用域中的属性”,这个在哪里用的呢?

<div ng-controller='SomeController'>
 <expander class='expander' expander-title='title'> {{text}} </expander>
 </div>

看到没,指令中的属性expander-title='title',这不就是传递父作用域中的属性吗?

③ expander-title与父作用域中的title属性绑定,找到它的值“点击展开”;

④ 将title的值显示在模板中。

注意:指令中的独立作用域中的属性title是为了给下面的模板使用 的,而title所对应的值,要依据页面中指令的使用传人具体的父作用域中的属性,完成属性的绑定操作。

总之、我们可以利用angularjs为我们提供的数据绑定策略来实现从父作用域向指令中传值,这个很有用哦!

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

Javascript 相关文章推荐
js left,right,mid函数
Jun 10 Javascript
防止文件缓存的js代码
Jan 10 Javascript
JS文本框不能输入空格验证方法
Mar 19 Javascript
浅析showModalDialog数据缓存问题(用禁止浏览器缓存解决)
Jul 09 Javascript
JS教程:window.location使用方法的区别介绍
Oct 04 Javascript
几种设置表单元素中文本输入框不可编辑的方法总结
Nov 25 Javascript
jquery中交替点击事件的实现代码
Feb 14 Javascript
jQuery制作拼图小游戏
Jan 12 Javascript
JS实现文件动态顺序载入的方法
Mar 07 Javascript
微信小程序实战之自定义模态弹窗(8)
Apr 18 Javascript
深入解析Vue源码实例挂载与编译流程实现思路详解
May 05 Javascript
node后端服务保活的实现
Nov 10 Javascript
js实现点击按钮弹出上传文件的窗口
Dec 23 #Javascript
AngularJS实践之使用ng-repeat中$index的注意点
Dec 22 #Javascript
JS中微信小程序自定义底部弹出框
Dec 22 #Javascript
Bootstrap源码解读表单(2)
Dec 22 #Javascript
javascript学习之json入门
Dec 22 #Javascript
Bootstrap源码解读网格系统(3)
Dec 22 #Javascript
js微信支付实现代码
Dec 22 #Javascript
You might like
如何让搜索引擎抓取AJAX内容解决方案
2014/08/25 PHP
PHP实现的线索二叉树及二叉树遍历方法详解
2016/04/25 PHP
PHP的自定义模板引擎
2017/03/24 PHP
利用 fsockopen() 函数开放端口扫描器的实例
2017/08/19 PHP
python进程与线程小结实例分析
2018/11/11 PHP
Firefox中autocomplete=&quot;off&quot; 设置不起作用Bug的解决方法
2011/03/25 Javascript
JavaScript中几个重要的属性(this、constructor、prototype)介绍
2013/05/19 Javascript
Javascript学习笔记之函数篇(四):arguments 对象
2014/11/23 Javascript
使用javascript实现监控视频播放并打印日志
2015/01/05 Javascript
javascript组合使用构造函数模式和原型模式实例
2015/06/04 Javascript
jQuery+HTML5美女瀑布流布局实现方法
2015/09/21 Javascript
jQuery表格行上移下移和置顶的实现方法
2015/10/08 Javascript
学习JavaScript正则表达式
2015/11/13 Javascript
浅析AngularJs HTTP响应拦截器
2015/12/28 Javascript
文件上传插件SWFUpload的使用指南
2016/11/29 Javascript
js实现下拉框效果(select)
2017/03/28 Javascript
JS库之Particles.js中文开发手册及参数详解
2017/09/13 Javascript
vue父组件向子组件(props)传递数据的方法
2018/01/02 Javascript
JavaScript Image对象实现原理实例解析
2020/08/26 Javascript
[02:09]抵达西雅图!中国军团加油!
2014/07/07 DOTA
python实现泊松图像融合
2018/07/26 Python
python连接、操作mongodb数据库的方法实例详解
2019/09/11 Python
python tkinter之 复选、文本、下拉的实现
2020/03/04 Python
Python常用类型转换实现代码实例
2020/07/28 Python
python实现简单的tcp 文件下载
2020/09/16 Python
CSS3毛玻璃效果(blur)有白边问题的解决方法
2016/11/15 HTML / CSS
本科生个人求职自荐信
2013/09/26 职场文书
英语专业毕业生自荐信范文
2013/12/31 职场文书
个人房屋买卖协议书(范本)
2014/10/04 职场文书
财务工作检讨书
2014/10/29 职场文书
美容院管理规章制度
2015/08/05 职场文书
婚礼迎宾词大全
2015/08/10 职场文书
信息技术教研组工作总结
2015/08/13 职场文书
《绝招》教学反思
2016/02/20 职场文书
Vue实现跑马灯样式文字横向滚动
2021/11/23 Vue.js
无线电通信名词解释
2022/02/18 无线电