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 相关文章推荐
Extjs TriggerField在弹出窗口显示不出问题的解决方法
Jan 08 Javascript
再论Javascript的类继承
Mar 05 Javascript
Javascript排序算法之合并排序(归并排序)的2个例子
Apr 04 Javascript
js如何判断用户是在PC端和还是移动端访问
Apr 24 Javascript
jQuery实现dialog设置focus焦点的方法
Jun 10 Javascript
javascript实现的网站访问量统计代码
Dec 20 Javascript
jqueryMobile使用示例分享
Jan 12 Javascript
jQuery Ajax File Upload实例源码
Dec 12 Javascript
javascript用rem来做响应式开发
Jan 13 Javascript
vuex与组件联合使用的方法
May 10 Javascript
使用Vue 自定义文件选择器组件的实例代码
Mar 04 Javascript
ES6 Symbol在对象中的作用实例分析
Jun 06 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 CURL模拟登录新浪微博抓取页面内容 基于EaglePHP框架开发
2012/01/16 PHP
提高PHP编程效率的方法
2013/11/07 PHP
四个PHP非常实用的功能
2015/09/29 PHP
php文件上传类的分享
2017/07/06 PHP
PHP实现微信退款功能
2018/10/02 PHP
php设计模式之工厂方法模式分析【星际争霸游戏案例】
2020/01/23 PHP
jquery创建div 实现代码
2009/04/27 Javascript
JavaScript面向对象之静态与非静态类
2010/02/03 Javascript
游览器中javascript的执行过程(图文)
2012/05/20 Javascript
jquery Mobile入门—多页面切换示例学习
2013/01/08 Javascript
jquery 鼠标滑动显示详情应用示例
2014/01/24 Javascript
jquery select2的使用心得(推荐)
2016/12/04 Javascript
vue组件实例解析
2017/01/10 Javascript
es6的数字处理的方法(5个)
2017/03/16 Javascript
微信小程序实现animation动画
2018/01/26 Javascript
详解swipe使用及竖屏页面滚动方法
2018/06/28 Javascript
vue-cli3 取消eslint校验代码的解决办法
2020/01/16 Javascript
javascript中contains是否包含功能实现代码(扩展字符、数组、dom)
2020/04/07 Javascript
[02:38]DOTA2 夜魇暗潮2020活动介绍官方视频
2020/11/04 DOTA
Python实现求笛卡尔乘积的方法
2017/09/16 Python
Python编程使用tkinter模块实现计算器软件完整代码示例
2017/11/29 Python
python实现最大优先队列
2019/08/29 Python
python 一维二维插值实例
2020/04/22 Python
京东港澳售:京东直邮港澳台
2018/01/31 全球购物
英国100%防污和防水的靴子:Muck Boot Company
2020/09/08 全球购物
旅游管理专业学生求职信
2013/09/28 职场文书
成人教育自我鉴定
2013/11/01 职场文书
公司保密承诺书
2014/03/27 职场文书
单位承诺书格式
2014/05/21 职场文书
市场策划求职信
2014/08/07 职场文书
2014幼儿园家长工作总结
2014/11/10 职场文书
北京青年观后感
2015/06/15 职场文书
2019企业文化管理制度范本!
2019/08/06 职场文书
星际争霸:毕姥爷vs解冻03
2022/04/01 星际争霸
苹果的回收机器人可以通过拆解iPhone获取大量的金和铜并外公布了环境保护最新进展
2022/04/21 数码科技
浅谈MySql update会锁定哪些范围的数据
2022/06/25 MySQL