2016-04-29 20 views
9

Bằng cách nào đó có thể kiểm tra xem phạm vi góc có bị cô lập hay không, chỉ có phạm vi?Cách kiểm tra xem phạm vi có bị cô lập không?

Tôi biết, phạm vi phân lập và không bị cô lập đó có các nguyên mẫu khác nhau. Tuy nhiên các nguyên mẫu này là riêng tư trong góc cạnh và không thể dễ dàng truy cập. Kiểm tra tên nguyên mẫu có vẻ như cách tiếp cận khá bẩn.

Bạn có ý tưởng nào tốt hơn không?

+0

cách kiểm tra xem có cha mẹ $ không? – thegio

+0

Phạm vi biệt lập cũng có cha mẹ. Chỉ phạm vi gốc không. –

+0

Tôi sẽ trả lời câu hỏi của bạn bằng một câu hỏi khác ... tại sao? haha – r0m4n

Trả lời

2

Sự khác biệt đầu tiên tôi biết là, Phạm vi biệt lập có trường "$ root", là rootScope.

Sự khác biệt thứ hai là, rằng phạm vi Isolated có "isolateBindings $$" lĩnh vực, nhưng không phải cách ly không có

+1

Hãy cẩn thận khi sử dụng bất kỳ thứ gì có tiền tố là '$$'. Những người này có nghĩa là riêng tư với AngularJS và có thể bị xóa bất kỳ lúc nào. –

+0

Có bạn đúng, nhưng trong một thời gian dài trường đó tồn tại .. –

+0

Điều này đúng, nhưng bạn phải nhớ kiểm tra nó bằng 'hasOwnProperty'. Nếu bạn không nó sẽ cho bạn kết quả sai như phạm vi prototypically xuất phát từ một phạm vi cô lập ở một mức độ nào đó. –

1

mỗi tài liệu, sau đây nên làm như lừa:

$element.isolateScope() 

truy xuất một phạm vi cô lập nếu được gắn trực tiếp vào phần tử hiện tại. Bộ thu thập này chỉ nên được sử dụng trên các phần tử có chứa chỉ thị bắt đầu một phạm vi cô lập mới. Phạm vi cuộc gọi() trên thành phần này luôn trả về phạm vi không cô lập ban đầu. Yêu cầu gỡ lỗi Dữ liệu được bật.

https://docs.angularjs.org/api/ng/function/angular.element#jquery-jqlite-extras

Như đã đề cập trong các tài liệu, nếu bạn cấu hình như sau (như bạn nên trong sản xuất):

$compileProvider.debugInfoEnabled(false); 

Phương pháp này sẽ không còn hoạt động ... Tôi cho rằng chính lý do để có được isolateScope theo cách này là để kiểm tra đơn vị và không thực sự là một lý do để có điều kiện thực hiện một số hành động trên phạm vi cách ly (sửa tôi nếu tôi sai).

https://jsfiddle.net/r0m4n/f84yzdt4/

0

Bạn có thể kiểm tra xem nó như thế này:

if (scope.hasOwnProperty('$root') && scope.$root !== scope && scope.$root) { 
    // the scope is isolate 
} 

Nó không phải là hoàn hảo vì nó phụ thuộc vào chi tiết thực hiện, nhưng tôi không thể nghĩ ra bất cứ điều gì tốt hơn thế này.

Giải thích:

  1. scope.hasOwnProperty('$root'). Mỗi phạm vi đều có thuộc tính này. Nó chỉ vào phạm vi tổ tiên gần nhất được phân lập hoặc $rootScope. Thuộc tính này được thừa kế nguyên mẫu, do đó, chỉ có riêng chỉ dành cho phạm vi cách ly và $rootScope.

  2. scope.$root !== scope. Kiểm tra phạm vi không phải là $rootScope.

  3. scope.$root. Có thể được thay thế bằng !scope.$$destroyed. Khi phạm vi bị hủy, null được gán cho nhiều thuộc tính của nó bao gồm $root, do đó thuộc tính sẽ trở thành của riêng bạn.

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