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简单实现根据身份证号码识别性别年龄生日
Nov 29 Javascript
按下回车键指向下一个位置的一个函数代码
Mar 10 Javascript
jQuery实现购物车多物品数量的加减+总价计算
Jun 06 Javascript
javascript实现多级联动下拉菜单的方法
Feb 06 Javascript
JavaScript调用浏览器打印功能实例分析
Jul 17 Javascript
谈谈对offsetleft兼容性的理解
Nov 11 Javascript
js的OOP继承实现(必看篇)
Feb 18 Javascript
使用selenium抓取淘宝的商品信息实例
Feb 06 Javascript
如何为你的JavaScript代码日志着色详解
Apr 08 Javascript
使用element-ui的el-menu导航选中后刷新页面保持当前选中状态
Jul 19 Javascript
小程序和web画三角形实现解析
Sep 02 Javascript
vue日历/日程提醒/html5本地缓存功能
Sep 02 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
文章推荐系统(三)
2006/10/09 PHP
PHP base64+gzinflate压缩编码和解码代码
2008/10/03 PHP
php中的strpos使用示例
2014/02/27 PHP
php查找字符串出现次数的方法
2014/12/01 PHP
php把数组值转换成键的方法
2015/07/13 PHP
PHP 搜索查询功能实现
2016/11/29 PHP
Js 订制自己的AlertBox(信息提示框)
2009/01/09 Javascript
window.onload 加载完毕的问题及解决方案(上)
2009/07/09 Javascript
jQuery实现点击文本框弹出热门标签的提示效果
2013/11/17 Javascript
使用AngularJS对路由进行安全性处理的方法
2015/06/18 Javascript
关于Vue单页面骨架屏实践记录
2017/12/13 Javascript
webpack打包node.js后端项目的方法
2018/03/10 Javascript
axios 处理 302 状态码的解决方法
2018/04/10 Javascript
深入理解javascript中的this
2021/02/08 Javascript
Python代理抓取并验证使用多线程实现
2013/05/03 Python
简单解决Python文件中文编码问题
2015/11/22 Python
Python爬取网易云音乐热门评论
2017/03/31 Python
TensorFlow实现简单卷积神经网络
2018/05/24 Python
Python中的Numpy矩阵操作
2018/08/12 Python
Python构建图像分类识别器的方法
2019/01/12 Python
Django框架实现的分页demo示例
2019/05/25 Python
django中瀑布流写法实例代码
2019/10/14 Python
Python StringIO如何在内存中读写str
2020/01/07 Python
如何定义TensorFlow输入节点
2020/01/23 Python
python框架flask入门之路由及简单实现方法
2020/06/07 Python
使用Python制作一个数据预处理小工具(多种操作一键完成)
2021/02/07 Python
利用CSS3的定位页面元素
2009/08/29 HTML / CSS
css背景图片的背景裁切、背景透明度、背景变换等效果运用
2012/12/24 HTML / CSS
利用纯CSS3实现动态的自行车特效源码
2017/01/20 HTML / CSS
日本快乐生活方式购物网站:Shop Japan
2018/07/17 全球购物
Clarks其乐鞋荷兰官网:Clarks荷兰
2019/07/05 全球购物
MVC的各个部分都有那些技术来实现?如何实现?
2016/04/21 面试题
赔偿协议书范本
2014/04/15 职场文书
新教师岗前培训方案
2014/06/05 职场文书
电子商务专业毕业生求职信
2014/06/12 职场文书
小学关爱留守儿童活动方案
2014/08/25 职场文书