当前位置:Gxlcms > JavaScript > AngularJS中如何使用$parse或$eval在运行时对Scope变量赋值

AngularJS中如何使用$parse或$eval在运行时对Scope变量赋值

时间:2021-07-01 10:21:17 帮助过:23人阅读

在"AngularJS中自定义有关一个表格的Directive"中自定义了一个有关表格的Direcitve,其表格的表现方式是这样的:

  1. <table-helper datasource="customers" clumnmap="[{name: 'Name'}, {street: 'Street'}, {age: 'Age'}, {url: 'URL', hidden: true}]"></table-helper>

以上,变量colmnmap的值是事先定义在了Scope中的:

  1. return {
  2. restrict: 'E',
  3. scope: {
  4. columnmap: '=',
  5. datasource: '='
  6. },
  7. link:link,
  8. template:template
  9. };

AngularJS中,还有一种运行时给Scope变量赋值的办法,那就是在link函数中使用$parse或$eval方法

在Direcitve的呈现方面和以前一致:

  1. <table-helper-with-parse datasource="customers" columnmap="[{name: 'Name'},...]"></table-helper-with-parse>

Directive大致是这样:

  1. var tableHelperWithParse = function($parse){
  2. var template = "",
  3. link = function(scope, element, attrs){
  4. var headerCols = [],
  5. tableStart = '<table>',
  6. tableEnd = '</table>',
  7. table = '',
  8. visibleProps = [],
  9. sortCol = null,
  10. sortDir = 1,
  11. columnmap = null;
  12. $scope.$watchCollection('datasource', render);
  13. //运行时赋值columnmap
  14. columnmap = scope.$eval(attrs.columnmap);
  15. //或者
  16. columnmap = $parse(attrs.columnmap)();
  17. wireEvents();
  18. function rener(){
  19. if(scope.datasource && scope.datasourse.length){
  20. table += tableStart;
  21. table += renderHeader();
  22. table += renderRows() + tableEnd;
  23. renderTable();
  24. }
  25. }
  26. };
  27. return {
  28. restrict: 'E',
  29. scope: {
  30. datasource: '='
  31. },
  32. link: link,
  33. template: template
  34. }
  35. }
  36. angular.module('direcitvesModule')
  37. .directive('tableHelperWithParse', tableHelperWithParse);

下面给大家介绍下$parse和$eval的不同

首先,$parse跟$eval都是用来解析表达式的, 但是$parse是作为一个单独的服务存在的。$eval是作为scope的方法来使用的。

$parse典型的使用是放在设置字符串表达式映射在真实对象上的值。也可以从$parse上直接获取到表达式对应的值。

  1. var getter = $parse('user.name');
  2. var setter = getter.assign;
  3. setter(scope, 'new name');
  4. getter(context, locals) // 传入作用域,返回值
  5. setter(scope,'new name') // 修改映射在scope上的属性的值为‘new value'

$eval 即scope.$eval,是执行当前作用域下的表达式,如:scope.$eval('a+b'); 而这个里的a,b是来自 scope = {a: 2, b:3};

看看源码它的实现是

  1. $eval: function(expr, locals) {
  2. return $parse(expr)(this, locals);
  3. },

可以找到它也是基于$parse,不过它的参数已经被固定为this,就是当前的scope,所以$eval只是在$parse基础上的封装而已,是一种$parse快捷的API。

人气教程排行