AngularJS và việc sử dụng Biến Dollar


128

Có ai biết lý do đằng sau việc sử dụng các phương pháp và biến đô la trong angularJS là để hướng dẫn angularJS để tránh kiểm tra các giá trị đó khi quá trình tiêu hóa đang diễn ra không? Vì vậy, nếu góc cạnh xuất hiện $scope.$value$scope.value, thì nó sẽ tránh kiểm tra cái trước vì nó có tiền tố là một ký tự đô la trong tên biến của nó?


Xem thêm bài đăng trên blog này, về sự khác biệt của "$ scope" và "scope" trong angularjs ...
MarcoS

19
Angular có lẽ đang cố gắng lấy $ từ jQuery.
daniel1426

Liên kết đó chuyển hướng đến một trang không giải thích nhiều về phạm vi $.
Paul Brannan

5
Các tài liệu cho chỉ thị - bộ điều khiển có $scope, nhưng chỉ thị có scope. WTF?
LeeGee

Câu trả lời:


87

Có một vài lần Angular bỏ qua các biến có tiền tố với ký hiệu đô la:

  1. Trong bình luận của Schumli bên dưới, nơi các bộ lọc json sẽ không xuất chúng
  2. Khi sử dụng {{ }}chỉ thị, góc sẽ không hiển thị các $ biến lồng nhau . Ví dụ, điều này chỉ hiển thị visibletài sản.

    <div ng-init="n = { visible: 'foo', $ignore: 'bar' };">{{ n }}</div>
  3. Ngoài ra, khi thêm trình theo dõi rõ ràng trên một đối tượng phạm vi, các thay đổi đối với các thuộc tính có ký hiệu đô la hàng đầu của đối tượng này sẽ không kích hoạt trình theo dõi. Xem fiddle cập nhật này .

  4. angular.equals() bỏ qua các khóa có tiền tố$ .


Vâng, có vẻ như bạn đúng. Ngay cả với các sự kiện nhấp chuột và như vậy nó vẫn thay đổi. Cảm ơn bạn.
Matsko

7
Có một số phần nhất định của Angular bỏ qua các thuộc tính có tiền tố, ví dụ: bộ lọc 'json' sẽ không xuất ra một biến bắt đầu bằng '$'.
Schmuli

116

Đây chỉ là quy ước đặt tên từ đoạn trích dưới đây http://docs.angularjs.org/tutorial/step_05

'$' Quy ước đặt tên tiền tố
Bạn có thể tạo các dịch vụ của riêng mình và trên thực tế, chúng tôi sẽ thực hiện chính xác ở bước 11. Như một quy ước đặt tên, các dịch vụ tích hợp của angular, các phương thức Phạm vi và một vài API góc khác có tiền tố '$' Trước mặt tên. Không sử dụng tiền tố '$' khi đặt tên cho các dịch vụ và mô hình của bạn, để tránh mọi va chạm có thể đặt tên.

http://docs.angularjs.org/guide/con accept # angular_namespace

Không gian tên góc
Để tránh va chạm tên ngẫu nhiên, Angular tiền tố tên của các đối tượng có khả năng va chạm với $. Vui lòng không sử dụng tiền tố $ trong mã của bạn vì nó có thể vô tình va chạm với mã Angular.


2
Tại sao tài liệu chỉ thị [1] có $scopetrong bộ điều khiển, nhưng scopetrong chỉ thị? --- [1] docs.angularjs.org/guide/directive
LeeGee

2
@LeeGee Đó chỉ là quy ước. stackoverflow.com/a/19289054/114558
rinogo

30

Các $tiền tố biểu thị một biến, tham số, bất động sản, hoặc phương pháp mà thuộc về cốt lõi của góc.

Các thuộc tính trên các đối tượng có nguồn gốc bên trong khung, nhưng thực tế không phải là một phần của API, có thể bắt đầu bằng $- hoặc thậm chí $$- để biểu thị một phương thức hoặc thuộc tính riêng tư . Đây là cùng một cách _tiền tố thường được sử dụng trong các thư viện khác.

Nó không có bất kỳ ảnh hưởng nào đến cách mã được diễn giải bởi bộ thực thi, mặc dù khung công tác có thể mang lại cho nó ý nghĩa đặc biệt. Về cơ bản, đó là một quy ước đặt tên có nội dung "Bạn không nên lộn xộn với điều này".


Tôi nghĩ bạn hiểu lầm. Thời gian chạy không quan tâm biến nào được đặt tên. Bạn có thể gọi nó $$__$_$- nó chỉ là một định danh không có ý nghĩa đặc biệt cho trình thông dịch.
dunkard 16/1/2015

Tôi đã thêm một vài từ để làm nổi bật sự khác biệt giữa thời gian chạy và khung; hãy tử tế để thay đổi phiếu bầu của bạn
dunkard

7

Không hoàn toàn chắc chắn, nhưng tôi tin rằng các bên trong AngularJS dựa vào việc thao túng các biến $ -prefixed này trong quá trình phân loại. Kiểm tra các biến này có nghĩa là thông báo sẽ không bao giờ ổn định, vì chúng có thể thay đổi liên tục trong mỗi chu kỳ của thông báo.

Đừng trích dẫn tôi về nó mặc dù. :)


10
Bị từ chối vì: "Đừng trích dẫn tôi về điều đó". Xin lỗi, nhưng một câu trả lời thừa nhận sự không chắc chắn không phải là một câu trả lời rất hữu ích :(
David Rivers

2
Downvote chuyển đổi thành up-. Giả sử bạn đúng, đây là một câu trả lời hữu ích!
David Rivers

2
@DavidRivers, nếu câu trả lời ban đầu là do dự, viết lại nó sẽ không làm cho nó hữu ích hơn. Trong thực tế, câu trả lời có thể sai và sự thiếu do dự sẽ khẳng định sai lầm tiềm ẩn . Thay vào đó, để câu trả lời này được coi là hữu ích, nó cần được sao lưu bằng một số bằng chứng bằng cách trích dẫn các nguồn đáng tin cậy hoặc cung cấp một câu đố để tái tạo các điểm được thể hiện.
Ivaylo Slavov

1
@IvayloSlavov: Tôi hoàn toàn đồng ý với bạn. Tôi giả định (có thể sai) rằng người trả lời đã kiểm tra lại rằng anh ta đúng và không chỉ đơn giản là viết lại câu trả lời để loại bỏ sự không chắc chắn. Tôi cho rằng tôi nên có nguồn hoặc câu đố.
David Rivers

1
@AlexFord: Này, anh bạn. Cảm ơn lời xin lỗi! Tôi xin lỗi tôi đã không rõ ràng và bắt đầu tất cả các thông tin sai lệch này. Quan điểm của bạn là hợp lệ và tôi đồng ý với bạn. Tôi chỉ muốn chắc chắn rằng tôi đã không được trình bày sai, nhưng tôi không rõ ràng với từ ngữ của riêng tôi. Dù sao, không có cảm giác khó khăn và tôi thực sự tôn trọng rằng bạn có thể thấy quan điểm của tôi. Chúc mừng, người đàn ông!
David Rivers

5

Tôi luôn luôn $trông giống như một chữ "S" cho dịch vụ.


đó là câu trả lời đúng Nó hợp lý và đơn giản. Đây là những dịch vụ thực tế vì vậy tốt hơn nên nhớ $ 'S' là dành cho dịch vụ. giải thích đơn giản tốt đẹp.
Yonk

2
$ phạm vi là một dịch vụ?
chót

5

Dấu đô la ( $ ) cũng ngăn các yếu tố không bị lặp (hoặc diễn giải) trong một số chỉ thị nhất định. Vì vậy, ví dụ các thuộc tính bắt đầu bằng $ không được sử dụng ng-repeatmệnh đề if trong vòng lặp for :

if(collection.hasOwnProperty(key) && key.charAt(0) != '$')

Ai đó đã đưa ra một vấn đề về chủ đề ở đây trên trang github angenses


Trong các shallowCopythuộc tính phương thức bắt đầu bằng $$ được bỏ qua vì một mệnh đề if trong khi lặp lại các đặc tính :

if (!(key.charAt(0) === '$' && key.charAt(1) === '$')) {

1

@MarcoS đã cung cấp liên kết tới https://thinkster.io/a-better-way-to-learn-angularjs/scope-vs-scope giải thích sự khác biệt giữa $ scope và scope. Tôi thấy điều này hữu ích, thêm vào thông tin trong các câu trả lời khác.

Trong một chỉ thị góc có một liên kết và bộ điều khiển. Liên kết là một hàm tiêu chuẩn với một bộ tham số cố định: phạm vi, phần tử, đối tượng thuộc tính.

Các đối số của bộ điều khiển được quản lý bởi bộ tiêm Angular và không phụ thuộc vào thứ tự. Trình tiêm giải quyết các đối tượng cần truyền vào bằng cách tìm các tham số bắt đầu bằng $.

Tác giả của https://thinkster.io/a-better-way-to-learn-angularjs/scope-vs-scope thực hiện công việc tốt hơn để giải thích nó.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.