2015-04-25 14 views
21

Tôi biết rằng $parse$eval cả hai đều hoạt động trên biểu thức Góc. Tại sao nhóm Góc đã tạo ra hai biểu thức này?

Tôi đã kiểm tra trong thư viện góc, $eval được định nghĩa như thế:

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

nên sự khác biệt giữa những gì là:

$parse(expr)(context, locals); 

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

Tôi muốn biết cái nào thực hành tốt nhất là gì? và khi nào thì dùng hai cái này?

Trả lời

29

Như bạn thấy,

$parse(expr)($scope, locals) 

chính xác tương đương với

$scope.$eval(expr, locals) 

Nhưng, $parse nhiều hoạt động "cơ bản" hơn $eval, và vì vậy, bạn có thể $parse một lần ở một nơi (ví dụ: trong hàm compile của chỉ thị):

var parsedExpr = $parse(tAttrs.p1); 

và sử dụng lặp đi lặp lại ở những nơi khác (ví dụ, trong một hàm controller)

var childScope1 = $scope.$new(); 
var childScope2 = $scope.$new(); 

var r1 = parsedExpr(childScope1); 
var r2 = parsedExpr(childScope2); 
20

Tôi nghĩ rằng sự khác biệt quan trọng là $eval là một phương pháp scope thực thi một biểu thức trên phạm vi hiện tại, trong khi $parse là một (dịch vụ toàn cầu hơn).

Vì vậy, bạn có thể nói $parse(expr)(context, locals);, với mọi ngữ cảnh, nhưng trong trường hợp $eval, context sẽ là scope.

4

$ eval đằng sau hậu trường sử dụng phân tích $ đối với phạm vi hiện tại.

Chúng ta hãy nói rằng bạn có

$scope.a = 2; 
$scope.b = 4; 

$parse("a*b") mang đến cho bạn một chức năng mà phải được đánh giá theo bối cảnh/đối tượng/Phạm vi để có được kết quả.

Bây giờ

var f = $parse("a*b"); 

var result = f($scope); chúng tôi đang sử dụng đầu ra của $ phân tích mà là một chức năng áp dụng đối với các $ phạm vi.

LƯU Ý:

  1. $eval luôn đánh giá biểu thức dựa trên phạm vi hiện tại và trả về kết quả Ví dụ: console.log($scope.$eval("a*b")); // 8

  2. $parse chỉ trả về chức năng và không hoạt động trên bất kỳ phạm vi. Ví dụ:

    var func = $parse("a*b"); 
    

tại func có thể được áp dụng đối với

  1. bất kỳ phạm vi

    var result = func($scope); 
    console.log(result); // 8 
    
  2. đối tượng

    var result1 = func({a:3 , b:3});  
    console.log(result1); // 9 
    

Vì vậy, cùng một biểu hiện phân tích cú pháp một lần có thể được đánh giá đối với bất kỳ phạm vi hoặc đối tượng.

Như đã nói ở trên, đối với $eval sử dụng góc $parse so với phạm vi hiện tại đằng sau hậu trường để đánh giá biểu thức và trả lại kết quả.

Nếu bạn muốn nhiều ngữ cảnh được thực hiện cho cùng một biểu thức $parse là lựa chọn tốt nhất.

Các vấn đề liên quan