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 相关文章推荐
js将字符串转成正则表达式的实现方法
Nov 13 Javascript
js获取时间(本周、本季度、本月..)
Nov 22 Javascript
jQuery在线选座位插件seat-charts特效代码分享
Aug 27 Javascript
cocos2dx骨骼动画Armature源码剖析(三)
Sep 08 Javascript
深入理解关于javascript中apply()和call()方法的区别
Apr 12 Javascript
JS复制对应id的内容到粘贴板(Ctrl+C效果)
Jan 23 Javascript
巧妙运用v-model实现父子组件传值的方法示例
Apr 07 Javascript
iview form清除校验状态的实现
Sep 19 Javascript
node.js域名解析实现方法详解
Nov 05 Javascript
详解javascript中var与ES6规范中let、const区别与用法
Jan 11 Javascript
JS实现简易留言板(节点操作)
Mar 16 Javascript
vue项目如何打包之项目打包优化(让打包的js文件变小)
Apr 30 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一行代码获取文件后缀名实例分析
2014/11/12 PHP
PHP 等比例缩放图片详解及实例代码
2016/09/18 PHP
thinkPHP中session()方法用法详解
2016/12/08 PHP
利用PHPExcel实现Excel文件的写入和读取
2017/04/26 PHP
PHP批量删除jQuery操作
2017/07/23 PHP
laravel实现查询最后执行的一条sql语句的方法
2019/10/09 PHP
javascript cookies操作集合
2010/04/12 Javascript
jquery模拟SELECT下拉框取值效果
2013/10/23 Javascript
jquery ajax 局部无刷新更新数据的实现案例
2014/02/08 Javascript
jQuery防止重复绑定事件的解决方法
2016/05/14 Javascript
AngularJS创建自定义指令的方法详解
2016/11/03 Javascript
canvas知识总结
2017/01/25 Javascript
js中创建对象的几种方式
2017/02/05 Javascript
JavaScript实现自动跳转文本功能
2017/05/25 Javascript
详谈JS中数组的迭代方法和归并方法
2017/08/11 Javascript
关于vue面试题汇总
2018/03/20 Javascript
Vue.js单向绑定和双向绑定实例分析
2018/08/14 Javascript
webpack多入口多出口的实现方法
2018/08/17 Javascript
基于Angularjs-router动态改变Title值的问题
2018/08/30 Javascript
js实现动态时钟
2020/03/12 Javascript
antd Form组件方法getFieldsValue获取自定义组件的值操作
2020/10/29 Javascript
Python面向对象编程中的类和对象学习教程
2015/03/30 Python
使用url_helper简化Python中Django框架的url配置教程
2015/05/30 Python
python3.6连接MySQL和表的创建与删除实例代码
2017/12/28 Python
对pandas的层次索引与取值的新方法详解
2018/11/06 Python
Python Pandas中根据列的值选取多行数据
2019/07/08 Python
PowerBI和Python关于数据分析的对比
2019/07/11 Python
在Tensorflow中查看权重的实现
2020/01/24 Python
Python使用扩展库pywin32实现批量文档打印实例
2020/04/09 Python
python 利用Pyinstaller打包Web项目
2020/10/23 Python
c语言常见笔试题总结
2016/09/05 面试题
高三自我鉴定范文
2013/10/19 职场文书
文员岗位职责范本
2014/03/08 职场文书
2015年挂职干部工作总结
2015/05/14 职场文书
java中用float时,数字后面加f,这样是为什么你知道吗
2021/09/04 Java/Android
MySQL学习之基础命令实操总结
2022/03/19 MySQL