2015-10-19 2 views
2

В некоторых случаях документация AngularJs предполагает использование eval() во время цикла $digest, и в некоторых случаях нам предлагается использовать parse() во время цикла $digest? Может ли кто-нибудь дать хороший пример, когда в цикле $digest мы должны использовать $eval() и $parse(), соответственно?

ответ

2

$parse принимает угловое выражение и возвращает функцию, которая представляет это выражение.

$eval принимает угловое выражение, оценивает его и возвращает фактический результат этого выражения.

Вы можете думать об этом, как это (это псевдо-код примера, чтобы показать, что я имею в виду, что это не так, как $parse на самом деле работает):

function $parse(expression) { 
    return function() { 
     return $eval(expression); 
    } 
} 
+0

Спасибо за reply.Also Я хотел бы знать, как $ Eval и $ parse играет роль в цикле $ digest, например, когда мы используем эти сервисы в цикле $ digest, когда у нас есть выражение – Kalaivani

+0

@ Kalaivani. Я рекомендую посмотреть [источник '$ digest'] (https: // github. com/angular/angular.js/blob/master/src/ng/rootScope.js # L723) для более подробных исследований. Объяснение того, что подробно слишком велико для StackOverflow – LionC

0

$ синтаксического анализа используется для создания функции на основе определенные объекты/выражения, например:

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'); 

Просто с $ синтаксический вы сможете создать OO объекта с Getter, сеттер, подробности приведены в https://docs.angularjs.org/api/ng/service/ $ разобрать и Источник: 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 использует $ разобрана, чтобы создать функцию $eval implementation:

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

Это связано к тому же, если я правильно понимаю синтаксический код $ parse, этот синтаксический анализ проверяет, какое выражение и контекст (область) у вас есть. В основном, $ Eval является сокращенным использование что-то вроде (вместо того, чтобы делать это каждый раз, когда за $ области объекта в контроллере, например):

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

expect(getter(scope)).toEqual(1); 
Смежные вопросы