AngularJS:AngularJS中$ eval()和$ parse有什么区别?

时间:2015-10-19 11:34:35

标签: angularjs

在某些情况下,AngularJs文档建议我们在eval()周期内使用$digest,在某些情况下,建议我们在parse()周期内使用$digest?任何人都可以在$digest周期中给出一个很好的例子,我们应该分别使用$eval()$parse()吗?

2 个答案:

答案 0 :(得分:2)

$parse采用角度表达式并返回表示该表达式的函数。

$eval采用角度表达式,对其进行求值并返回该表达式的实际结果。

你可以这样想(这是伪示例代码来表明我的意思,这不是SLComposeViewController *facebook = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeFacebook]; [facebook setInitialText:@"Lorem Ipsum"]; [facebook addURL:[NSURL URLWithString:@"http://stackoverflow.com"]]; [facebook setCompletionHandler:^(SLComposeViewControllerResult result) { switch (result) { case SLComposeViewControllerResultCancelled: NSLog(@"Post Canceled"); break; case SLComposeViewControllerResultDone: NSLog(@"Post Sucessful"); break; default: break; } }]; [self presentViewController:facebook animated:YES completion:nil]; 实际上的工作方式):

$parse

答案 1 :(得分:0)

$ parse用于基于定义的对象/表达式创建函数,例如:

var getter = $parse('user.name');
var setter = getter.assign;
var context = {user:{name:'angular'}};
var locals = {user:{name:'local'}};

expect(getter(context)).toEqual('angular');
setter(context, 'newValue');
expect(context.user.name).toEqual('newValue');
expect(getter(context, locals)).toEqual('local');

只需使用$ parse,您就可以使用Getter,Setter创建OO对象,详细信息在https://docs.angularjs.org/api/ng/service/ $ parse和来源:https://github.com/angular/angular.js/blob/master/src/ng/parse.js#L1678处提供。

$ eval用于根据表达式检索结果:

var scope = ng.$rootScope.Scope();
scope.a = 1;
scope.b = 2;

expect(scope.$eval('a+b')).toEqual(3);
expect(scope.$eval(function(scope){ return scope.a + scope.b; })).toEqual(3);

有趣的是,$ eval正在使用$ parse创建一个函数$eval implementation

 $eval: function(expr, locals) {
        return $parse(expr)(this, locals);
      },

这与事实有关,如果我理解$ parse代码权限,那么$ parse会检查你有什么样的表达式和上下文(范围)。基本上,$ eval是一种简写用法(例如,不是每次为控制器中的$ scope对象执行此操作):

var getter = $parse("a");
var setter = getter.assign;
scope.a = 1;

expect(getter(scope)).toEqual(1);