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数组使用调用方法汇总
Dec 08 Javascript
JS中==与===操作符的比较
Mar 21 Javascript
基于MooTools的很有创意的滚动条时钟动画
Nov 14 Javascript
Js与下拉列表处理问题解决
Feb 13 Javascript
jQuery判断数组是否包含了指定的元素
Mar 10 Javascript
jQuery菜单插件superfish使用指南
Apr 21 Javascript
JavaScript中日期的相关操作方法总结
Oct 24 Javascript
JavaScript中的时间处理小结
Feb 24 Javascript
js纯数字逐一停止显示效果的实现代码
Mar 16 Javascript
Vue2.2.0+新特性整理及注意事项
Aug 22 Javascript
解决vue elementUI中table里数字、字母、中文混合排序问题
Jan 07 Javascript
2019年度web前端面试题总结(主要为Vue面试题)
Jan 12 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
什么是调频(FM)、调幅(AM)、短波(SW)、长波(LW)
2021/03/01 无线电
数组与类使用PHP的可变变量名需要的注意的问题
2013/06/20 PHP
PHP系统命令函数使用分析
2013/07/05 PHP
Yii2增删改查之查询 where参数详细介绍
2016/08/08 PHP
IE8 浏览器Cookie的处理
2009/01/31 Javascript
Fixie.js 自动填充内容的插件
2012/06/28 Javascript
页面使用密码保护代码
2013/04/10 Javascript
JS操作Cookies的小例子
2013/10/15 Javascript
jquery text(),val(),html()方法区别总结
2013/11/04 Javascript
js取消单选按钮选中并判断对象是否为空
2013/11/14 Javascript
IE下Ajax缓存问题的快速解决方法(get方式)
2014/01/09 Javascript
javascript 获取浏览器版本
2015/01/21 Javascript
分享9个最好用的JavaScript开发工具和代码编辑器
2015/03/24 Javascript
Jquery实现鼠标移动放大图片功能实例
2015/03/25 Javascript
JS实现从连接中获取youtube的key实例
2015/07/02 Javascript
JS实现把鼠标放到链接上出现滚动文字的方法
2016/04/06 Javascript
Bootstrap导航条的使用和理解3
2016/12/14 Javascript
JS实现仿饿了么在浏览器标签页失去焦点时网页Title改变
2017/06/01 Javascript
记录一次完整的react hooks实践
2019/03/11 Javascript
微信小程序里引入SVG矢量图标的方法
2019/09/20 Javascript
python网络编程学习笔记(二):socket建立网络客户端
2014/06/09 Python
浅析Python编写函数装饰器
2016/03/18 Python
python扫描proxy并获取可用代理ip的实例
2017/08/07 Python
pandas object格式转float64格式的方法
2018/04/10 Python
使用11行Python代码盗取了室友的U盘内容
2018/10/23 Python
pyqt5 实现多窗口跳转的方法
2019/06/19 Python
浅谈Python程序的错误:变量未定义
2020/06/02 Python
Python入门基础之数字字符串与列表
2021/02/01 Python
技术副厂长岗位职责
2013/12/26 职场文书
初二学习计划书范文
2014/04/27 职场文书
党员领导干部承诺书
2014/05/28 职场文书
传播学专业毕业生自荐书
2014/07/01 职场文书
税务干部群众路线教育实践活动对照检查材料
2014/09/20 职场文书
村主任群众路线教育实践活动个人对照检查材料思想汇报
2014/10/01 职场文书
签约仪式致辞
2015/07/30 职场文书
浅谈Nginx 中的两种限流方式
2021/03/31 Servers