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 相关文章推荐
Bootstrap入门书籍之(一)排版
Feb 17 Javascript
网页中JS函数自动执行常用三种方法
Mar 30 Javascript
超实用的JavaScript代码段 附使用方法
May 22 Javascript
jquery.qtip提示信息插件用法简单实例
Jun 17 Javascript
Javascript中作用域的详细介绍
Oct 06 Javascript
jQuery插件HighCharts实现的2D面积图效果示例【附demo源码下载】
Mar 15 Javascript
详解axios在node.js中的post使用
Apr 27 Javascript
Vue CLI3.0中使用jQuery和Bootstrap的方法
Feb 28 jQuery
详解JavaScript函数callee、call、apply的区别
Mar 08 Javascript
JavaScript显式数据类型转换详解
Mar 18 Javascript
JS Canvas接口和动画效果大全
Apr 29 Javascript
vue实现可拖拽的dialog弹框
May 13 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 危险函数全解析
2009/09/09 PHP
php 抽象类的简单应用
2011/09/06 PHP
Yii中Model(模型)的创建及使用方法
2015/12/28 PHP
JavaScipt基本教程之JavaScript语言的基础
2008/01/16 Javascript
用js实现层随着内容大小动态渐变改变 推荐
2009/12/19 Javascript
JQuery 1.6发布 性能提升,同时包含大量破坏性变更
2011/05/10 Javascript
文字溢出实现溢出的部分再放入一个新生成的div中具体代码
2013/05/17 Javascript
javascript禁用键盘功能键让右击及其他键无效
2013/10/09 Javascript
自编jQuery插件实现模拟alert和confirm
2014/09/01 Javascript
为什么JS中eval处理JSON数据要加括号
2015/04/13 Javascript
简介JavaScript中的setDate()方法的使用
2015/06/11 Javascript
jQuery进行组件开发完整实例
2015/12/15 Javascript
jQuery+HTML5+CSS3制作支持响应式布局时间轴插件
2016/08/10 Javascript
ajax与json 获取数据并在前台使用简单实例
2017/01/19 Javascript
Echarts基本用法_动力节点Java学院整理
2017/08/11 Javascript
使用Vuex实现一个笔记应用的方法
2018/03/13 Javascript
react配置antd按需加载的使用
2019/02/11 Javascript
JavaScript数组、json对象、eval()函数用法实例分析
2019/02/21 Javascript
vue与django集成打包的实现方法
2019/11/11 Javascript
详解js中的几种常用设计模式
2020/07/16 Javascript
11月编程语言排行榜 Python逆袭C#上升到第4
2017/11/15 Python
解决Python 使用h5py加载文件,看不到keys()的问题
2019/02/08 Python
Python实现求两个数组交集的方法示例
2019/02/23 Python
python3实现弹弹球小游戏
2019/11/25 Python
python基于三阶贝塞尔曲线的数据平滑算法
2019/12/27 Python
Python bytes string相互转换过程解析
2020/03/05 Python
django 前端页面如何实现显示前N条数据
2020/03/16 Python
详解基于python的全局与局部序列比对的实现(DNA)
2020/10/07 Python
python tkinter实现连连看游戏
2020/11/16 Python
selenium+headless chrome爬虫的实现示例
2021/01/08 Python
工程部主管岗位职责
2013/11/17 职场文书
高二地理教学反思
2014/01/24 职场文书
争做文明公民倡议书
2014/08/29 职场文书
高中升旗仪式演讲稿
2014/09/09 职场文书
如何书写民事调解协议书?
2019/06/25 职场文书
win11如何查看端口是否被占用? Win11查看端口是否占用的技巧
2022/04/05 数码科技