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 相关文章推荐
60行js代码实现俄罗斯方块
Mar 31 Javascript
JavaScript中输出信息的方法(信息确认框-提示输入框-文档流输出)
Jun 12 Javascript
JS实现的简单轮播图运动效果示例
Dec 22 Javascript
微信小程序 图片上传实例详解
May 05 Javascript
react实现菜单权限控制的方法
Dec 11 Javascript
Node.js调用fs.renameSync报错(Error: EXDEV, cross-device link not permitted)
Dec 27 Javascript
jQuery基于Ajax实现读取XML数据功能示例
May 31 jQuery
解决vue2.0路由跳转未匹配相应用路由避免出现空白页面的问题
Aug 24 Javascript
如何优雅地在vue中添加权限控制示例详解
Mar 07 Javascript
微信小程序实现自定义动画弹框/提示框的方法实例
Nov 06 Javascript
js重写alert事件(避免alert弹框标题出现网址)
Dec 04 Javascript
JS代码编译器Monaco使用方法
Jun 11 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
Mysql中分页查询的两个解决方法比较
2013/05/02 PHP
Yii调试SQL的常用方法
2014/07/09 PHP
javascript(jquery)利用函数修改全局变量的代码
2009/11/02 Javascript
javascript简易缓动插件(源码打包)
2012/02/16 Javascript
jQuery代码实现发展历程时间轴特效
2015/07/30 Javascript
浅谈jquery中next与siblings的区别
2016/10/27 Javascript
利用D3.js实现最简单的柱状图示例代码
2016/12/09 Javascript
js的三种继承方式详解
2017/01/21 Javascript
NodeJS自定义模块写法(详解)
2017/06/27 NodeJs
Angular弹出模态框的两种方式
2017/10/19 Javascript
AngularJS自定义表单验证功能实例详解
2018/08/24 Javascript
React 实现拖拽功能的示例代码
2019/01/06 Javascript
详解JWT token心得与使用实例
2019/08/02 Javascript
vue中进行微博分享的实例讲解
2019/10/14 Javascript
解决Antd 里面的select 选择框联动触发的问题
2020/10/24 Javascript
Nuxt 嵌套路由nuxt-child组件用法(父子页面组件的传值)
2020/11/05 Javascript
[46:14]VGJ.T vs Liquid 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
python Popen 获取输出,等待运行完成示例
2019/12/30 Python
Python基于gevent实现文件字符串查找器
2020/08/11 Python
New Balance波兰官方商城:始于1906年,百年慢跑品牌
2017/08/15 全球购物
全球性的在线婚纱礼服工厂:27dress.com
2019/03/21 全球购物
荷兰时尚精品店:Labels Fashion
2020/03/22 全球购物
数据库笔试题
2013/05/09 面试题
幼师求职自荐信范文
2014/01/26 职场文书
硕士生工作推荐信
2014/03/07 职场文书
医药营销个人求职信
2014/04/12 职场文书
大学生新学期计划书
2014/04/28 职场文书
展览会邀请函
2015/02/02 职场文书
爱心捐助活动总结
2015/05/09 职场文书
初级职称评定工作总结
2015/08/13 职场文书
房屋转让协议书(标准范本)
2016/03/21 职场文书
Python机器学习之逻辑回归
2021/05/11 Python
使用python创建股票的时间序列可视化分析
2022/03/03 Python
Python图像处理库PIL详细使用说明
2022/04/06 Python
Android Flutter实现图片滑动切换效果
2022/04/07 Java/Android
vue3引入highlight.js进行代码高亮的方法实例
2022/04/08 Vue.js