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在for循环中绑定事件解决事件参数不同的情况
Jan 20 Javascript
微信WeixinJSBridge API使用实例
May 25 Javascript
JS实现统计复选框选中个数并提示确定与取消的方法
Jul 01 Javascript
基于jQuery倾斜打开侧边栏菜单特效代码
Sep 15 Javascript
微信小程序 天气预报开发实例代码源码
Jan 20 Javascript
Angular在一个页面中使用两个ng-app的方法
Feb 20 Javascript
详解Angular2组件之间如何通信
Jun 22 Javascript
微信小程序自定义组件
Aug 16 Javascript
jQuery滚动条美化插件nicescroll简单用法示例
Apr 18 jQuery
layui树形菜单动态遍历的例子
Sep 23 Javascript
webpack HappyPack实战详解
Oct 08 Javascript
基于vue 动态菜单 刷新空白问题的解决
Aug 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
玛琪朵 Macchiato
2021/03/03 咖啡文化
PHP基础学习小结
2011/04/17 PHP
php 定义404页面的实现代码
2012/11/19 PHP
解决yii2左侧菜单子级无法高亮问题的方法
2016/05/08 PHP
php封装的smartyBC类完整实例
2016/10/19 PHP
解析页面加载与js函数的执行 onload or ready
2013/12/12 Javascript
css3元素简单的闪烁效果实现(html5 jquery)
2013/12/28 Javascript
jquery预览图片实现鼠标放上去显示实际大小
2014/01/16 Javascript
node.js中的fs.lstatSync方法使用说明
2014/12/16 Javascript
以Python代码实例展示kNN算法的实际运用
2015/10/26 Javascript
jquery移动端TAB触屏切换实现效果
2020/12/22 Javascript
jQuery实现鼠标滚动图片延迟加载效果附源码下载
2016/06/28 Javascript
Vuex利用state保存新闻数据实例
2017/06/28 Javascript
react-native-fs实现文件下载、文本存储的示例代码
2017/09/22 Javascript
vue源码学习之Object.defineProperty对象属性监听
2018/05/30 Javascript
解决vue-cli webpack打包后加载资源的路径问题
2018/09/25 Javascript
vue使用echarts图表的详细方法
2018/10/22 Javascript
vue中nextTick用法实例
2019/09/11 Javascript
js在HTML的三种引用方式详解
2020/08/29 Javascript
[01:09]DOTA2次级职业联赛 - 99战队宣传片
2014/12/01 DOTA
python实现的阳历转阴历(农历)算法
2014/04/25 Python
Python+django实现文件下载
2016/01/17 Python
git使用.gitignore设置不生效或不起作用问题的解决方法
2017/06/01 Python
django中的setting最佳配置小结
2017/11/21 Python
Python程序退出方式小结
2017/12/09 Python
Python数据结构之栈、队列及二叉树定义与用法浅析
2018/12/27 Python
Python脚本破解压缩文件口令实例教程(zipfile)
2020/06/14 Python
巴西图书和电子产品购物网站:Saraiva
2017/06/07 全球购物
Ancheer官方户外和运动商店:销售电动自行车
2019/08/07 全球购物
美国饼干礼物和美食甜点购买网站:Cheryl’s
2020/05/28 全球购物
德国亚马逊官方网站:Amazon.de
2020/11/15 全球购物
电子商务个人职业生涯规划范文
2014/02/12 职场文书
一年级学生期末评语
2014/04/21 职场文书
社区志愿者培训方案
2014/06/10 职场文书
Python爬虫爬取全球疫情数据并存储到mysql数据库的步骤
2021/03/29 Python
我的收音机情缘
2022/04/05 无线电