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 相关文章推荐
THREE.JS入门教程(5)你应当知道的十件事
Jan 24 Javascript
javascript同页面多次调用弹出层具体实例代码
Aug 16 Javascript
JS获取地址栏参数的几种方法小结
Feb 28 Javascript
关于img的href和src取变量及赋值的方法
Apr 28 Javascript
封装好的一个万能检测表单的方法
Jan 21 Javascript
TypeScript 中接口详解
Jun 19 Javascript
Bootstrap轮播插件简单使用方法介绍
Jun 21 Javascript
BootStrap注意事项小结(五)表单
Mar 10 Javascript
修改node.js默认的npm安装目录实例
May 15 Javascript
详解如何在Vue项目中导出Excel
Apr 19 Javascript
JS原形与原型链深入详解
May 09 Javascript
jquery插件实现搜索历史
Apr 24 jQuery
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 array_unique之后json_encode需要注意
2011/01/02 PHP
PDO预处理语句PDOStatement对象使用总结
2014/11/20 PHP
php中Socket创建与监听实现方法
2015/01/05 PHP
PHP统计当前在线用户数实例讲解
2015/10/21 PHP
PHP基于PDO调用sqlserver存储过程通用方法【基于Yii框架】
2017/10/07 PHP
非常漂亮的JS代码经典广告
2007/10/21 Javascript
javascript将数组插入到另一个数组中的代码
2013/01/10 Javascript
JS获得选取checkbox整行数据的方法
2015/01/28 Javascript
学习JavaScript鼠标响应事件
2015/12/25 Javascript
[原创]Bootstrap 中下拉菜单修改成鼠标悬停直接显示
2016/04/14 Javascript
浅谈原生JS实现jQuery的animate()动画示例
2017/03/08 Javascript
javascript 开发之百度地图使用到的js函数整理
2017/05/19 Javascript
IScroll5实现下拉刷新上拉加载的功能实例
2017/08/11 Javascript
jquery实现回车键触发事件(实例讲解)
2017/11/21 jQuery
js实现坦克移动小游戏
2019/10/28 Javascript
Vue中qs插件的使用详解
2020/02/07 Javascript
[56:01]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 Effect vs EG
2018/03/31 DOTA
[58:23]LGD vs TNC 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
[56:13]DOTA2-DPC中国联赛定级赛 LBZS vs Phoenix BO3第一场 1月10日
2021/03/11 DOTA
python try except 捕获所有异常的实例
2018/10/18 Python
基于Python实现拆分和合并GIF动态图
2019/10/22 Python
Pytorch中的VGG实现修改最后一层FC
2020/01/15 Python
如何学习Python time模块
2020/06/03 Python
Python如何给你的程序做性能测试
2020/07/29 Python
纯CSS3实现图片无间断轮播效果
2016/08/25 HTML / CSS
俄罗斯皮肤健康中心:Pharmacosmetica.ru
2020/02/22 全球购物
中专毕业生自我鉴定
2013/11/21 职场文书
展会邀请函范文
2014/01/26 职场文书
小学领导班子对照材料
2014/08/23 职场文书
2014年学校德育工作总结
2014/12/05 职场文书
先进基层党组织事迹材料
2014/12/25 职场文书
工作自我评价范文
2015/03/05 职场文书
入党转正介绍人意见
2015/06/03 职场文书
毕业典礼致辞
2015/07/29 职场文书
2016高三毕业赠言寄语
2015/12/04 职场文书
CSS浮动引起的高度塌陷问题
2022/08/05 HTML / CSS