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 prototype,executing,context,closure
Dec 24 Javascript
Juqery Html(),append()等方法的Bug解决方法
Dec 13 Javascript
js 静态动态成员 and 信息的封装和隐藏
May 29 Javascript
Javascript中常见的校验如域名、手机、邮箱等等
Jan 02 Javascript
教你用AngularJS框架一行JS代码实现控件验证效果
Jun 23 Javascript
javascript去掉代码里面的注释
Jul 24 Javascript
浅析Node.js的Stream模块中的Readable对象
Jul 29 Javascript
js自定义瀑布流布局插件
May 16 Javascript
js实现数组内数据的上移和下移的实例
Nov 14 Javascript
ios设备中angularjs无法改变页面title的解决方法
Sep 13 Javascript
微信jssdk逻辑在vue中的运用详解
Nov 14 Javascript
JavaScript函数式编程(Functional Programming)组合函数(Composition)用法分析
May 22 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
有关phpmailer的详细介绍及使用方法
2013/01/28 PHP
一个简单的php加密解密函数(动态加密)
2013/06/19 PHP
PHP实现基于文本的摩斯电码生成器
2016/01/11 PHP
Apache PHP MySql安装配置图文教程
2016/08/27 PHP
分享十五个最佳jQuery 幻灯插件和教程
2010/03/27 Javascript
理解Javascript_07_理解instanceof实现原理
2010/10/15 Javascript
40款非常有用的 jQuery 插件推荐(系列一)
2011/12/21 Javascript
node.js实现逐行读取文件内容的代码
2014/06/27 Javascript
JQuery实现动态添加删除评论的方法
2015/05/18 Javascript
JS+CSS实现的简单折叠展开多级菜单效果
2015/09/12 Javascript
js转html实体的方法
2016/09/27 Javascript
NodeJS遍历文件生产文件列表功能示例
2017/01/22 NodeJs
JS判断一个数是否是水仙花数
2017/06/11 Javascript
Express + Node.js实现登录拦截器的实例代码
2017/07/01 Javascript
jquery实现用户登陆界面(示例讲解)
2017/09/06 jQuery
JavaScript使用FileReader实现图片上传预览效果
2020/03/27 Javascript
解决vue的 v-for 循环中图片加载路径问题
2018/09/03 Javascript
vue实现同一个页面可以有多个router-view的方法
2018/09/20 Javascript
vue视频播放插件vue-video-player的具体使用方法
2019/11/08 Javascript
Vue仿百度搜索功能
2020/12/28 Vue.js
python 排列组合之itertools
2013/03/20 Python
python批量添加zabbix Screens的两个脚本分享
2017/01/16 Python
Python实现矩阵转置的方法分析
2017/11/24 Python
Python对列表去重的多种方法(四种方法)
2017/12/05 Python
python实现的Iou与Giou代码
2020/01/18 Python
Python-opencv实现红绿两色识别操作
2020/06/04 Python
如何在windows下安装配置python工具Ulipad
2020/10/27 Python
DataList 能否分页,请问如何实现?
2015/05/03 面试题
当x.equals(y)等于true时,x.hashCode()与y.hashCode()可以不相等,这句话对不对
2015/05/02 面试题
竞聘副主任科员演讲稿
2014/01/11 职场文书
餐厅执行经理岗位职责范本
2014/02/26 职场文书
销售团队口号大全
2014/06/06 职场文书
小组口号大全
2014/06/09 职场文书
领导干部群众路线对照检查材料
2014/11/05 职场文书
2014年乡镇民政工作总结
2014/12/02 职场文书
Android开发EditText禁止输入监听及InputFilter字符过滤
2022/06/10 Java/Android