在某些情况下,AngularJs文档建议我们在eval()
周期内使用$digest
,在某些情况下,建议我们在parse()
周期内使用$digest
?任何人都可以在$digest
周期中给出一个很好的例子,我们应该分别使用$eval()
和$parse()
吗?
答案 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);