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 相关文章推荐
jQuery ctrl+Enter shift+Enter实现代码
Feb 07 Javascript
jQuery客户端分页实例代码
Nov 18 Javascript
JavaScript如何实现对数字保留两位小数一位自动补零
Dec 18 Javascript
自定义require函数让浏览器按需加载Js文件
Nov 24 Javascript
js每隔两秒输出数组中的一项(实例)
May 28 Javascript
react-router中的属性详解
Jun 01 Javascript
微信小程序 五星评分的实现实例
Aug 04 Javascript
详解JS中的柯里化(currying)
Aug 17 Javascript
微信小程序解除10个请求并发限制
Dec 18 Javascript
使用form-create动态生成vue自定义组件和嵌套表单组件
Jan 18 Javascript
让mocha支持ES6模块的方法实现
Jan 14 Javascript
JS端基于download.js实现图片、视频时直接下载而不是打开预览
May 09 Javascript
学习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对象类型判断
2008/08/27 PHP
PHP中获取文件扩展名的N种方法小结
2012/02/27 PHP
PHP调用VC编写的COM组件实例
2014/03/29 PHP
ThinkPHP标签制作教程
2014/07/10 PHP
PHP常见漏洞攻击分析
2016/02/21 PHP
php版微信数据统计接口用法示例
2016/10/12 PHP
php获取字符串前几位的实例(substr返回字符串的子串用法)
2017/03/08 PHP
php判断/计算闰年的方法小结【三种方法】
2019/07/06 PHP
jquery pagination插件实现无刷新分页代码
2009/10/13 Javascript
基于jquery的弹出提示框始终处于窗口的居中位置(类似于alert弹出框的效果)
2011/09/28 Javascript
js 获取时间间隔实现代码
2014/05/12 Javascript
javascript和jquery实现设置和移除文本框默认值效果代码
2015/01/13 Javascript
Javascript简单实现面向对象编程继承实例代码
2015/11/27 Javascript
jquery实现全选和全不选功能效果的实现代码【推荐】
2016/05/05 Javascript
Javascript基础教程之比较null和undefined值
2016/05/16 Javascript
微信小程序 后台https域名绑定和免费的https证书申请详解
2016/11/10 Javascript
微信小程序商城项目之商品属性分类(4)
2017/04/17 Javascript
Angular.js实现获取验证码倒计时60秒按钮的简单方法
2017/10/18 Javascript
TypeScript开发Node.js程序的方法
2019/04/30 Javascript
Vue-Cli 3.0 中配置高德地图的两种方式
2019/06/19 Javascript
js和jquery判断数据类型的4种方法总结
2020/08/28 jQuery
[02:37]2018DOTA2亚洲邀请赛赛前采访-EG篇
2018/04/03 DOTA
[53:15]Newbee vs Pain 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python验证码识别处理实例
2015/12/28 Python
python中input()与raw_input()的区别分析
2016/02/27 Python
python动态加载包的方法小结
2016/04/18 Python
python调用java的jar包方法
2018/12/15 Python
Python实现高斯函数的三维显示方法
2018/12/29 Python
python3 pillow模块实现简单验证码
2019/10/31 Python
python类共享变量操作
2020/09/03 Python
Python Pandas list列表数据列拆分成多行的方法实现
2020/12/14 Python
用CSS禁用输入法(CSS3 UI规范)实例解析
2012/12/04 HTML / CSS
全球500多个机场的接送服务:Suntransfers
2019/06/03 全球购物
医学院校毕业生自荐信范文
2014/01/01 职场文书
宿舍保安职务说明书
2014/02/25 职场文书
2014年社区学雷锋活动总结
2014/03/09 职场文书