Sự khác nhau giữa là gì $parse
, $interpolate
và $compile
dịch vụ? Đối với tôi tất cả đều làm điều tương tự: lấy mẫu và biên dịch nó thành hàm mẫu.
Sự khác nhau giữa là gì $parse
, $interpolate
và $compile
dịch vụ? Đối với tôi tất cả đều làm điều tương tự: lấy mẫu và biên dịch nó thành hàm mẫu.
Câu trả lời:
Đó là tất cả các ví dụ về các dịch vụ hỗ trợ hiển thị chế độ xem AngularJS (mặc dù $parse
và $interpolate
có thể được sử dụng bên ngoài miền này). Để minh họa vai trò của mỗi dịch vụ, hãy lấy ví dụ về đoạn HTML này:
var imgHtml = '<img ng-src="/path/{{name}}.{{extension}}">'
và các giá trị trên phạm vi:
$scope.name = 'image';
$scope.extension = 'jpg';
Đưa ra đánh dấu này ở đây là những gì mỗi dịch vụ mang đến cho bảng:
$compile
- nó có thể lấy toàn bộ đánh dấu và biến nó thành một hàm liên kết, khi được thực thi theo một phạm vi nhất định sẽ biến một đoạn văn bản HTML thành động, DOM sống với tất cả các lệnh (ở đây ng-src
:) phản ứng với các thay đổi của mô hình. Người ta sẽ gọi nó như sau: $ compile (imgHtml) ($ scope) và kết quả sẽ nhận được một phần tử DOM với tất cả các giới hạn sự kiện DOM. $compile
đang tận dụng $interpolate
(trong số những thứ khác) để thực hiện công việc của mình.$interpolate
biết cách xử lý một chuỗi với các biểu thức nội suy nhúng, ví dụ : /path/{{name}}.{{extension}}
. Nói cách khác, nó có thể lấy một chuỗi với các biểu thức nội suy, một phạm vi và biến nó thành văn bản kết quả. Người ta có thể nghĩ về $interpolation
dịch vụ như một ngôn ngữ mẫu dựa trên chuỗi rất đơn giản. Cho ví dụ trên, người ta sẽ sử dụng dịch vụ này như sau: $interpolate("/path/{{name}}.{{extension}}")($scope)
để lấy path/image.jpg
chuỗi kết quả.$parse
được sử dụng $interpolate
để đánh giá các biểu thức riêng lẻ ( name
, extension
) theo phạm vi. Nó có thể được sử dụng để cả đọc và đặt giá trị cho một biểu thức đã cho. Ví dụ, để đánh giá name
biểu thức người ta sẽ làm: $parse('name')($scope)
để lấy giá trị "hình ảnh". Để đặt giá trị người ta sẽ làm:$parse('name').assign($scope, 'image2')
Tất cả các dịch vụ này đang làm việc cùng nhau để cung cấp giao diện người dùng trực tiếp trong AngularJS. Nhưng họ hoạt động trên các cấp độ khác nhau:
$parse
chỉ quan tâm đến các biểu thức riêng lẻ ( name
, extension
). Đây là một dịch vụ đọc-ghi.$interpolate
chỉ đọc và quan tâm đến các chuỗi chứa nhiều biểu thức ( /path/{{name}}.{{extension}}
)$compile
là trung tâm của máy móc AngularJS và có thể biến các chuỗi HTML (với các chỉ thị và biểu thức nội suy) thành DOM trực tiếp.$interpolate
trong AnjularJS và cuối cùng tôi đã nhận được một câu trả lời nhỏ gọn và nhiều thông tin.
$interpolate-->
Let us say you have two variables assigned to $scope object in the controller,
$scope.a = 2;
$scope.b = 3;
var f = $interpolate("Result is : {{a*b}}");
var result = f($scope);
console.log(result); --->'Result is 6'
This means that $interpolate can take the string which has one or more angular expressions.
Now $parse:
var f1 = $parse("a*b");
var result1 = f1($scope);
console.log(result1); ----> '6'
**So $interpolate has the capability to evaluate a string with angular expressions mixed up in the string against the scope to get the result**.
Another important difference between $interpolate and $parse,$eval is:
**$interpolate has the capability to work with strings containing filters along with angular expressions.**
This feature is not accessible in $eval , $parse.
console.log($interpolate("Result is : {{a*b | currency : 'USD$'}}")($scope));
---> 'Result is USD $6.00'
$ interpolate không có quyền ghi vào các biến $ scope như chúng ta có trong $ eval và $ parse
$ parse, $ interpolate ---> cần được tiêm nhưng $ eval không cần phải được tiêm trong bộ điều khiển hoặc nơi nó được sử dụng
$ parse, $ interpolate cung cấp hàm có thể được đánh giá theo bất kỳ bối cảnh nào nhưng $ eval luôn được đánh giá theo phạm vi $.
$ eval và $ nội suy đằng sau hậu trường chỉ sử dụng $ parse.
Đây là lời giải thích dễ thương.
var img = img/{{name}}.{{extension}}
$parse - > (name,extension) = > vimal , .jpg
$interpolate -> use angular $parse and convert into string -> img/vimal.jpg
$compile -> can turn html string img/vimal.jpg into live DOM so new img tag will be added inside our DOM with all prototype that a img tag have.