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 相关文章推荐
父窗口获取弹出子窗口文本框的值
Jun 27 Javascript
js setTimeout opener的用法示例详解
Oct 23 Javascript
使用jQuery实现的掷色子游戏动画效果
Mar 14 Javascript
在Linux上用forever实现Node.js项目自启动
Jul 09 Javascript
JS实现跟随鼠标闪烁转动色块的方法
Feb 26 Javascript
jQuery简单实现提交数据出现loading进度条的方法
Mar 29 Javascript
JavaScript函数柯里化详解
Apr 29 Javascript
Bootstrap模态框调用功能实现方法
Sep 19 Javascript
微信小程序 页面跳转和数据传递实例详解
Jan 19 Javascript
详解JavaScript 中 if / if...else...替换方式
Jul 15 Javascript
js判断非127开头的IP地址的实例代码
Jan 05 Javascript
手把手教你如何编译打包video.js
Dec 09 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
SONY SRF-M100的电路分析
2021/03/02 无线电
神盾加密解密教程(一)PHP变量可用字符
2014/05/28 PHP
PHP小技巧之函数重载
2014/06/02 PHP
php 反斜杠处理函数addslashes()和stripslashes()实例详解
2016/12/25 PHP
ThinkPHP5与单元测试PHPUnit使用详解
2020/02/23 PHP
通过百度地图获取公交线路的站点坐标的js代码
2012/05/11 Javascript
图标线性回归斜着移动到指定的位置
2013/08/16 Javascript
javascript内置对象arguments详解
2014/03/16 Javascript
js实现仿MSN带关闭功能的右下角弹窗代码
2015/09/04 Javascript
关于javascript中dataset的问题小结
2015/11/16 Javascript
Jquery组件easyUi实现表单验证示例
2016/08/23 Javascript
探索Javascript中this的奥秘
2016/12/11 Javascript
JavaScript中数组的各种操作的总结(必看篇)
2017/02/13 Javascript
基于AngularJS拖拽插件ngDraggable.js实现拖拽排序功能
2019/04/02 Javascript
详解vue中使用axios对同一个接口连续请求导致返回数据混乱的问题
2019/11/06 Javascript
解决VUE mounted 钩子函数执行时 img 未加载导致页面布局的问题
2020/07/27 Javascript
js绘制一条直线并旋转45度
2020/08/21 Javascript
python进阶教程之异常处理
2014/08/30 Python
对Pyhon实现静态变量全局变量的方法详解
2019/01/11 Python
8段用于数据清洗Python代码(小结)
2019/10/31 Python
python中property和setter装饰器用法
2019/12/19 Python
Python3爬虫中Selenium的用法详解
2020/07/10 Python
python爬取代理IP并进行有效的IP测试实现
2020/10/09 Python
matplotlib运行时配置(Runtime Configuration,rc)参数rcParams解析
2021/01/05 Python
详解pycharm的python包opencv(cv2)无代码提示问题的解决
2021/01/29 Python
P D PAOLA意大利官网:西班牙著名的珠宝首饰品牌
2019/09/24 全球购物
莫斯科购买书籍网站:Book24
2020/01/12 全球购物
威盛公司软件C++工程师笔试题面试题
2012/07/16 面试题
生物专业个人自荐信范文
2013/11/29 职场文书
公司授权委托书格式范文
2014/10/02 职场文书
2014年文员工作总结
2014/11/18 职场文书
2014年就业工作总结
2014/11/26 职场文书
高考百日冲刺决心书
2015/09/23 职场文书
2016年第二十届“母亲节暨幸福工程救助贫困母亲活动日”活动总结
2016/04/06 职场文书
MySQL连接查询你真的学会了吗?
2021/06/02 MySQL
MySQL事务的隔离级别详情
2022/07/15 MySQL