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 网页黑白效果实现代码(兼容IE/FF等)
Apr 23 Javascript
javascript多种数据类型表格排序代码分析
Sep 11 Javascript
javascript 三种方法实现获得和设置以及移除元素属性
Mar 20 Javascript
jquery ajax提交整个表单元素的快捷办法
Mar 27 Javascript
javascript弹出层输入框(示例代码)
Dec 11 Javascript
js字符串操作方法实例分析
May 06 Javascript
JavaScript简单判断复选框是否选中及取出值的方法
Aug 13 Javascript
JavaScript控制浏览器全屏及各种浏览器全屏模式的方法、属性和事件
Dec 20 Javascript
JS加载iFrame出现空白问题的解决办法
May 13 Javascript
JavaScript闭包和范围实例详解
Dec 19 Javascript
JavaScript基础之静态方法和实例方法分析
Dec 26 Javascript
微信小程序动态设置图片大小的方法
Nov 21 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
php array_intersect比array_diff快(附详细的使用说明)
2011/07/03 PHP
php实现统计目录文件大小的函数
2015/12/25 PHP
PHP使用pear实现mail发送功能 windows环境下配置pear
2016/04/15 PHP
PHP+MySQL存储数据常见中文乱码问题小结
2016/06/13 PHP
JQuery.ajax传递中文参数的解决方法 推荐
2011/03/28 Javascript
遍历DOM对象内的元素属性示例代码
2014/02/08 Javascript
精通JavaScript的this关键字
2020/05/28 Javascript
VUEJS实战之利用laypage插件实现分页(3)
2016/06/13 Javascript
通过javascript进行UTF-8编码的实现方法
2016/06/27 Javascript
jQuery中页面返回顶部的方法总结
2016/12/30 Javascript
详解js产生对象的3种基本方式(工厂模式,构造函数模式,原型模式)
2017/01/09 Javascript
JS实现复选框的全选和批量删除功能
2017/04/05 Javascript
vue组件 $children,$refs,$parent的使用详解
2017/07/31 Javascript
Vue结合SignalR实现前后端实时消息同步
2017/09/19 Javascript
封装运动框架实战左右与上下滑动的焦点轮播图(实例)
2017/10/17 Javascript
vue-cli项目根据线上环境分别打出测试包和生产包
2018/05/23 Javascript
JavaScript setInterval()与setTimeout()计时器
2019/12/27 Javascript
vue 全局封装loading加载教程(全局监听)
2020/11/05 Javascript
详解vite2.0配置学习(typescript版本)
2021/02/25 Javascript
Python使用matplotlib绘制动画的方法
2015/05/20 Python
使用httplib模块来制作Python下HTTP客户端的方法
2015/06/19 Python
Python实现的生产者、消费者问题完整实例
2018/05/30 Python
python修改txt文件中的某一项方法
2018/12/29 Python
Python3.6实现根据电影名称(支持电视剧名称),获取下载链接的方法
2019/08/26 Python
HTML5 input placeholder 颜色修改示例
2014/05/30 HTML / CSS
世界上最大的售后摩托车零配件超市:J&P Cycles
2017/12/08 全球购物
创造美妙香氛体验:Aera扩散器和香水
2018/11/25 全球购物
你们项目是如何进行变更控制的
2015/08/26 面试题
幼儿园家长评语
2014/02/10 职场文书
如何写一份好的英文求职信
2014/03/19 职场文书
施工单位安全责任书
2014/07/24 职场文书
珠宝的促销活动方案
2014/08/31 职场文书
优秀学生干部事迹材料
2014/12/24 职场文书
酒桌上的开场白
2015/06/01 职场文书
企业愿景口号
2015/12/25 职场文书
python基于tkinter制作无损音乐下载工具
2021/03/29 Python