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 测试及效验工具
Apr 18 Javascript
javascript读写XML实现广告轮换(兼容IE、FF)
Aug 09 Javascript
jquery获取select选中值的方法分析
Dec 22 Javascript
JS模仿手机端九宫格登录功能实现代码
Apr 28 Javascript
AngularJS 中的Promise --- $q服务详解
Sep 14 Javascript
简单理解vue中el、template、replace元素
Oct 27 Javascript
详解vue中axios的封装
Jul 18 Javascript
关于vue v-for 循环问题(一行显示四个,每一行的最右边那个计算属性)
Sep 04 Javascript
详解Vue.js iview实现树形权限表(可扩展表)
Sep 30 Javascript
Vue.js 无限滚动列表性能优化方案
Dec 02 Javascript
JavaScript简易计算器制作
Jan 17 Javascript
Ajax实现异步加载数据
Nov 17 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
Apache, PHP在Windows 9x/NT下的安装与配置 (二)
2006/10/09 PHP
php根据日期显示所在星座的方法
2015/07/13 PHP
jQuery队列控制方法详解queue()/dequeue()/clearQueue()
2010/12/02 Javascript
JQuery触发事件例如click
2013/09/11 Javascript
javascript trim函数在IE下不能用的解决方法
2014/09/12 Javascript
理解javascript中的原型和原型链
2015/07/30 Javascript
Bootstrap选项卡学习笔记分享
2017/02/13 Javascript
AngularJS 霸道的过滤器小结
2017/04/26 Javascript
JS jQuery使用正则表达式去空字符的简单实现代码
2017/05/20 jQuery
JavaScript 程序错误Cannot use 'in' operator to search的解决方法
2017/07/10 Javascript
underscore之Collections_动力节点Java学院整理
2017/07/10 Javascript
Express使用html模板的详细代码
2017/09/18 Javascript
微信小程序实现打卡日历功能
2020/09/21 Javascript
微信小程序tab切换可滑动切换导航栏跟随滚动实现代码
2019/09/04 Javascript
JS使用H5实现图片预览功能
2019/09/30 Javascript
vux-scroller实现移动端上拉加载功能过程解析
2019/10/08 Javascript
JavaScript实现英语单词题库
2019/12/24 Javascript
Python  __getattr__与__setattr__使用方法
2008/09/06 Python
python解析html开发库pyquery使用方法
2014/02/07 Python
python2和python3的输入和输出区别介绍
2018/11/20 Python
Python Pexpect库的简单使用方法
2019/01/29 Python
Django中ORM外键和表的关系详解
2019/05/20 Python
使用Python中的reduce()函数求积的实例
2019/06/28 Python
Python3.6实现根据电影名称(支持电视剧名称),获取下载链接的方法
2019/08/26 Python
如何解决django-celery启动后迅速关闭
2019/10/16 Python
Python while循环使用else语句代码实例
2020/02/07 Python
基于python图书馆管理系统设计实例详解
2020/08/05 Python
Python压缩模块zipfile实现原理及用法解析
2020/08/14 Python
屈臣氏越南官网:Watsons越南
2021/01/14 全球购物
芭比波朗加拿大官方网站:Bobbi Brown Cosmetics CA
2020/11/05 全球购物
.NET里面如何取得当前的屏幕分辨率
2012/12/06 面试题
本科生的职业生涯规划范文
2014/01/09 职场文书
幼儿园开学寄语
2014/04/03 职场文书
教育局党的群众路线教育实践活动整改方案
2014/09/20 职场文书
2015年乡镇扶贫工作总结
2015/04/08 职场文书
职场干货:简历中的自我评价应该这样写!
2019/05/06 职场文书