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 简单抽屉效果的实现代码
Mar 09 Javascript
JS基于Mootools实现的个性菜单效果代码
Oct 21 Javascript
学习javascript面向对象 掌握创建对象的9种方式
Jan 04 Javascript
基于Javascript实现返回顶部按钮
Feb 29 Javascript
AngularJS 2.0入门权威指南
Oct 08 Javascript
JS 循环li添加点击事件 (闭包的应用)
Dec 10 Javascript
vue.js实例todoList项目
Jul 07 Javascript
微信小程序 共用变量值的实现
Jul 12 Javascript
React 无状态组件(Stateless Component) 与高阶组件
Aug 14 Javascript
JS实现判断数组是否包含某个元素示例
May 24 Javascript
vue中的循环对象属性和属性值用法
Sep 04 Javascript
浅谈JS的原型和原型链
Jun 04 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框架CodeIgniter主从数据库配置方法分析
2018/05/25 PHP
理解 JavaScript 预解析
2009/10/25 Javascript
jQuery UI-Draggable 参数集合
2010/01/10 Javascript
Jquery实战_读书笔记1—选择jQuery
2010/01/22 Javascript
EASYUI TREEGRID异步加载数据实现方法
2012/08/22 Javascript
Lazy Load 延迟加载图片的jQuery插件中文使用文档
2012/10/18 Javascript
extjs tabpanel限制选项卡数量实现思路及代码
2013/04/02 Javascript
js实现数组去重、判断数组以及对象中的内容是否相同
2013/11/29 Javascript
表单验证插件Validation应用的实例讲解
2015/10/10 Javascript
javascript验证内容为数字以及长度为10的简单实例
2016/08/20 Javascript
jQuery实现级联下拉框实战(5)
2017/02/08 Javascript
vue使用keep-alive实现数据缓存不刷新
2017/10/21 Javascript
JavaScript原生实现观察者模式的示例
2017/12/15 Javascript
详解vue+vuex+koa2开发环境搭建及示例开发
2018/01/22 Javascript
JavaScript简单实现的仿微博留言功能示例
2019/01/17 Javascript
使用JS判断页面是首次被加载还是刷新
2019/05/26 Javascript
javascript实现异形滚动轮播
2019/11/28 Javascript
JS实现音乐导航特效
2020/01/06 Javascript
python使用paramiko实现远程拷贝文件的方法
2016/04/18 Python
使用Mixin设计模式进行Python编程的方法讲解
2016/06/21 Python
Python之os操作方法(详解)
2017/06/15 Python
如何用Python来理一理红楼梦里的那些关系
2019/08/14 Python
python使用opencv实现马赛克效果示例
2019/09/28 Python
idea2020手动安装python插件的实现方法
2020/07/17 Python
python调用百度AI接口实现人流量统计
2021/02/03 Python
6号汽车旅馆预订:Motel 6
2018/02/11 全球购物
迪卡侬比利时官网:Decathlon比利时
2019/12/28 全球购物
英文版销售经理个人求职信
2013/11/20 职场文书
医学生毕业自我鉴定
2014/03/26 职场文书
上班离岗检讨书
2014/09/10 职场文书
三严三实对照检查材料
2014/09/22 职场文书
开展党的群众路线教育实践活动总结报告
2014/10/31 职场文书
晚会主持人开场白台词
2015/05/28 职场文书
2015年征兵工作总结
2015/07/23 职场文书
2016简历自荐信优秀范文
2016/01/29 职场文书
python+opencv实现视频抽帧示例代码
2021/06/11 Python