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 学习笔记(四)
Dec 31 Javascript
Javascript学习笔记一 之 数据类型
Dec 15 Javascript
js中字符替换函数String.replace()使用技巧
Aug 14 Javascript
增强用户体验友好性之jquery easyui window 窗口关闭时的提示
Jun 22 Javascript
jquery.ajax的url中传递中文乱码问题的解决方法
Feb 07 Javascript
JavaScript设置获取和设置属性的方法
Mar 04 Javascript
javascript实现二叉树的代码
Jun 08 Javascript
微信小程序如何刷新当前界面的实现方法
Jun 07 Javascript
vue2.0 解决抽取公用js的问题
Jul 31 Javascript
Vant 在vue-cli 4.x中按需加载操作
Nov 05 Javascript
element-ui封装一个Table模板组件的示例
Jan 04 Javascript
一文彻底理解js原生语法prototype,__proto__和constructor
Oct 24 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 什么是PEAR?(第三篇)
2009/03/19 PHP
PHP开源开发框架ZendFramework使用中常见问题说明及解决方案
2014/06/12 PHP
微信公众号判断用户是否已关注php代码解析
2016/06/24 PHP
PHP中OpenSSL加密问题整理
2017/12/14 PHP
PHP生成短网址的思路以及实现方法的详解
2019/03/25 PHP
PHP whois查询类定义与用法示例
2019/04/03 PHP
php7 参数、整形及字符串处理机制修改实例分析
2020/05/25 PHP
javascript读取xml
2006/11/04 Javascript
23个Javascript弹出窗口特效整理
2011/02/25 Javascript
js判断横竖屏及禁止浏览器滑动条示例
2014/04/29 Javascript
使用jQuery管理选择结果
2015/01/20 Javascript
Javascript核心读书有感之表达式和运算符
2015/02/11 Javascript
javascript实现checkBox的全选,反选与赋值
2015/03/12 Javascript
谈谈JavaScript中function多重理解
2015/08/28 Javascript
jQuery实现div拖拽效果实例分析
2016/02/20 Javascript
AngularJS directive返回对象属性详解
2016/03/28 Javascript
javascript实现的左右无缝滚动效果
2016/09/19 Javascript
解决Window10系统下Node安装报错的问题分析
2016/12/13 Javascript
Angular2库初探
2017/03/01 Javascript
js 毫秒转天时分秒的实例
2017/11/17 Javascript
详解Vue基于vue-quill-editor富文本编辑器使用心得
2019/01/03 Javascript
js设置鼠标悬停改变背景色实现详解
2019/06/26 Javascript
React实现全选功能
2020/08/25 Javascript
JavaScript TAB栏切换效果的示例
2020/11/05 Javascript
Python2.7编程中SQLite3基本操作方法示例
2017/08/09 Python
Python返回数组/List长度的实例
2018/06/23 Python
python基于gevent实现并发下载器代码实例
2019/11/01 Python
CSS+jQuery实现的在线答题功能
2015/04/25 HTML / CSS
Unix控制后台进程都有哪些进程
2016/09/22 面试题
CNC数控操作工岗位职责
2013/11/19 职场文书
查摆问题整改措施
2014/10/24 职场文书
2014年租房协议书范本
2014/10/30 职场文书
工作证明格式范文
2015/06/15 职场文书
初一年级组工作总结
2015/08/12 职场文书
2016秋季运动会前导词
2015/11/25 职场文书
Mysql 如何查询时间段交集
2021/06/08 MySQL