AngularJS中如何使用$parse或$eval在运行时对Scope变量赋值


Posted in Javascript onJanuary 25, 2016

在"AngularJS中自定义有关一个表格的Directive"中自定义了一个有关表格的Direcitve,其表格的表现方式是这样的:

<table-helper datasource="customers" clumnmap="[{name: 'Name'}, {street: 'Street'}, {age: 'Age'}, {url: 'URL', hidden: true}]"></table-helper>

以上,变量colmnmap的值是事先定义在了Scope中的:

return {
restrict: 'E',
scope: {
columnmap: '=',
datasource: '='
},
link:link,
template:template
};

AngularJS中,还有一种运行时给Scope变量赋值的办法,那就是在link函数中使用$parse或$eval方法

在Direcitve的呈现方面和以前一致:

<table-helper-with-parse datasource="customers" columnmap="[{name: 'Name'},...]"></table-helper-with-parse>

Directive大致是这样:

var tableHelperWithParse = function($parse){
var template = "",
link = function(scope, element, attrs){
var headerCols = [],
tableStart = '<table>',
tableEnd = '</table>',
table = '',
visibleProps = [],
sortCol = null,
sortDir = 1,
columnmap = null;
$scope.$watchCollection('datasource', render);
//运行时赋值columnmap
columnmap = scope.$eval(attrs.columnmap);
//或者
columnmap = $parse(attrs.columnmap)();
wireEvents();
function rener(){
if(scope.datasource && scope.datasourse.length){
table += tableStart;
table += renderHeader();
table += renderRows() + tableEnd;
renderTable();
}
}
};
return {
restrict: 'E',
scope: {
datasource: '='
},
link: link,
template: template
}
}
angular.module('direcitvesModule')
.directive('tableHelperWithParse', tableHelperWithParse);

下面给大家介绍下$parse和$eval的不同

首先,$parse跟$eval都是用来解析表达式的, 但是$parse是作为一个单独的服务存在的。$eval是作为scope的方法来使用的。

$parse典型的使用是放在设置字符串表达式映射在真实对象上的值。也可以从$parse上直接获取到表达式对应的值。

var getter = $parse('user.name'); 
var setter = getter.assign; 
setter(scope, 'new name');
getter(context, locals) // 传入作用域,返回值
setter(scope,'new name') // 修改映射在scope上的属性的值为‘new value'

$eval 即scope.$eval,是执行当前作用域下的表达式,如:scope.$eval('a+b'); 而这个里的a,b是来自 scope = {a: 2, b:3};

看看源码它的实现是

$eval: function(expr, locals) {
return $parse(expr)(this, locals);
},

可以找到它也是基于$parse,不过它的参数已经被固定为this,就是当前的scope,所以$eval只是在$parse基础上的封装而已,是一种$parse快捷的API。

Javascript 相关文章推荐
JavaScript小技巧 2.5 则
Sep 12 Javascript
jQuery中attr()和prop()在修改checked属性时的区别
Jul 18 Javascript
JS实现网页滚动条感应鼠标变色的方法
Feb 26 Javascript
JS网页在线获取鼠标坐标值的方法
Feb 28 Javascript
JavaScript的React Web库的理念剖析及基础上手指南
May 10 Javascript
网络传输协议(http协议)
Nov 18 Javascript
layer实现弹窗提交信息
Dec 12 Javascript
javaScript 逻辑运算符使用技巧整理
May 03 Javascript
JS通过位运算实现权限加解密
Aug 14 Javascript
纯javascript实现选择框的全选与反选功能
Apr 08 Javascript
解决在Vue中使用axios POST请求变成OPTIONS的问题
Aug 14 Javascript
vue项目配置 webpack-obfuscator 进行代码加密混淆的实现
Feb 26 Vue.js
学习JavaScript事件流和事件处理程序
Jan 25 #Javascript
javascript产生随机数方法汇总
Jan 25 #Javascript
在AngularJS中如何使用谷歌地图把当前位置显示出来
Jan 25 #Javascript
理解JavaScript表单的基础知识
Jan 25 #Javascript
jquery获取文档高度和窗口高度汇总
Jan 25 #Javascript
JavaScript数组的一些奇葩行为
Jan 25 #Javascript
JavaScript文本框脚本编写的注意事项
Jan 25 #Javascript
You might like
php 分库分表hash算法
2009/11/12 PHP
探讨多键值cookie(php中cookie存取数组)的详解
2013/06/06 PHP
php使用curl模拟登录后采集页面的例子
2013/11/04 PHP
PHP中的使用curl发送请求(GET请求和POST请求)
2017/02/08 PHP
Thinkphp3.2实用篇之计算型验证码示例
2017/02/09 PHP
PHP使用PHPExcel实现批量上传到数据库的方法
2017/06/08 PHP
php静态成员方法和静态的成员属性的使用方法
2017/10/26 PHP
广告显示判断
2006/08/31 Javascript
小型js框架veryide.librar源代码
2009/03/05 Javascript
一些mootools的学习资源
2010/02/07 Javascript
原生js实现改变随意改变div属性style的名称和值的结果
2013/09/26 Javascript
做web开发 先学JavaScript
2014/12/12 Javascript
微信和qq时间格式模板实例详解
2016/10/21 Javascript
快速入门Vue
2016/12/19 Javascript
js制作可以延时消失的菜单
2017/01/13 Javascript
详解微信开发中snsapi_base和snsapi_userinfo及静默授权的实现
2017/03/11 Javascript
在iFrame子页面里实现模态框的方法
2018/08/17 Javascript
React中使用外部样式的3种方式(小结)
2019/05/28 Javascript
学习LayUI时自研的表单参数校验框架案例分析
2019/07/29 Javascript
vue本地打开build后生成的dist文件夹index.html问题
2019/09/04 Javascript
使用 Python 获取 Linux 系统信息的代码
2014/07/13 Python
Python操作列表之List.insert()方法的使用
2015/05/20 Python
Python使用xlrd模块操作Excel数据导入的方法
2015/05/26 Python
详解Python异常处理中的Finally else的功能
2017/12/29 Python
Python Pandas数据结构简单介绍
2019/07/03 Python
python 按钮点击关闭窗口的实现
2020/03/04 Python
欧姆龙医疗保健与医疗产品:Omron Healthcare
2020/02/10 全球购物
毕业生求职的求职信
2013/12/05 职场文书
小学班干部竞选演讲稿
2014/04/24 职场文书
售后客服个人自我评价
2014/09/14 职场文书
2014年德育工作总结
2014/11/20 职场文书
入党积极分子个人总结
2015/03/02 职场文书
2019行政前台转正申请书范文3篇
2019/08/15 职场文书
pytest配置文件pytest.ini的详细使用
2021/04/17 Python
mysql脏页是什么
2021/07/26 MySQL
python模拟浏览器 使用selenium进入好友QQ空间并留言
2022/04/12 Python