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 相关文章推荐
javascript 日期时间函数(经典+完善+实用)
May 27 Javascript
JSON 学习之JSON in JavaScript详细使用说明
Feb 23 Javascript
JS子父窗口互相操作取值赋值的方法介绍
May 11 Javascript
node.js中的buffer.fill方法使用说明
Dec 14 Javascript
JavaScript实现99乘法表及隔行变色实例代码
Feb 24 Javascript
jQuery插件zTree实现更新根节点中第i个节点名称的方法示例
Mar 08 Javascript
原生javascript实现分页效果
Apr 21 Javascript
vue+webpack实现异步组件加载的方法
Feb 03 Javascript
详解vue2.0 资源文件assets和static的区别
Nov 27 Javascript
ng-zorro-antd 入门初体验
Dec 03 Javascript
Ajax实现异步加载数据
Nov 17 Javascript
如何vue使用el-table遍历循环表头和表体数据
Apr 26 Vue.js
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
PHP开发需要注意的安全问题
2010/09/01 PHP
php源代码安装常见错误与解决办法分享
2013/05/28 PHP
利用PHP实现短域名互转
2013/07/05 PHP
WordPress中&quot;无法将上传的文件移动至&quot;错误的解决方法
2015/07/01 PHP
PHP经典实用正则表达式小结
2017/05/04 PHP
php字符串截取函数mb_substr用法实例分析
2019/06/25 PHP
PHP论坛实现积分系统的思路代码详解
2020/06/01 PHP
一个无限级XML绑定跨框架菜单(For IE)
2007/01/27 Javascript
html中使用javascript调用本地程序(exe、doc等)实现代码
2013/04/26 Javascript
js 左右悬浮对联广告特效代码
2014/12/12 Javascript
jQuery简单实现页面元素置顶时悬浮效果示例
2016/08/01 Javascript
微信小程序上滑加载下拉刷新(onscrollLower)分批加载数据(二)
2017/05/11 Javascript
详解vue-resource promise兼容性问题
2017/06/20 Javascript
vue中promise的使用及异步请求数据的方法
2018/11/08 Javascript
javascript实现计算指定范围内的质数示例
2018/12/29 Javascript
深入了解query和params的使用区别
2019/06/24 Javascript
在项目vue中使用echarts的操作步骤
2020/09/07 Javascript
Javascript异步流程控制之串行执行详解
2020/09/27 Javascript
[56:21]LGD vs IG 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
[02:40]2018年度DOTA2最佳新人-完美盛典
2018/12/16 DOTA
python类和函数中使用静态变量的方法
2015/05/09 Python
Python中用于检查英文字母大写的isupper()方法
2015/05/19 Python
Python使用plotly绘制数据图表的方法
2017/07/18 Python
Python使用sorted对字典的key或value排序
2018/11/15 Python
解决django中ModelForm多表单组合的问题
2019/07/18 Python
Python-Flask:动态创建表的示例详解
2019/11/22 Python
python关于变量名的基础知识点
2020/03/03 Python
Python3实现个位数字和十位数字对调, 其乘积不变
2020/05/03 Python
css3 自定义字体font-face使用介绍
2014/05/14 HTML / CSS
下面代码从性能上考虑,有什么问题
2015/04/03 面试题
药剂专业学生求职信范文
2013/12/28 职场文书
经销商年会策划方案
2014/05/29 职场文书
捐书倡议书
2014/08/29 职场文书
学习nginx基础知识
2021/09/04 Servers
python图像处理 PIL Image操作实例
2022/04/09 Python
Vue 打包后相对路径的引用问题
2022/06/05 Vue.js