Câu hỏi này đã bị đánh đến chết, nhưng dù sao tôi cũng sẽ chia sẻ câu hỏi này trong trường hợp có người khác đang vật lộn với mớ hỗn độn khủng khiếp đó là phạm vi AngularJS. Điều này sẽ che =
, <
, @
, &
và ::
. Việc viết đầy đủ có thể được tìm thấy ở đây .
=
thiết lập một ràng buộc hai chiều. Thay đổi tài sản ở cha mẹ sẽ dẫn đến thay đổi ở trẻ, và ngược lại.
<
thiết lập một ràng buộc một chiều, cha mẹ với con. Thay đổi tài sản ở cha mẹ sẽ dẫn đến thay đổi ở trẻ, nhưng thay đổi tài sản con sẽ không ảnh hưởng đến tài sản của cha mẹ.
@
sẽ gán cho thuộc tính con giá trị chuỗi của thuộc tính thẻ. Nếu thuộc tính chứa một biểu thức , thuộc tính con cập nhật bất cứ khi nào biểu thức ước lượng thành một chuỗi khác. Ví dụ:
<child-component description="The movie title is {{$ctrl.movie.title}}" />
bindings: {
description: '@',
}
Ở đây, thuộc description
tính trong phạm vi con sẽ là giá trị hiện tại của biểu thức "The movie title is {{$ctrl.movie.title}}"
, trong đó movie
một đối tượng trong phạm vi cha.
&
là một chút khó khăn, và trên thực tế dường như không có lý do thuyết phục nào để sử dụng nó. Nó cho phép bạn đánh giá một biểu thức trong phạm vi cha, thay thế các tham số bằng các biến từ phạm vi con. Một ví dụ ( plunk ):
<child-component
foo = "myVar + $ctrl.parentVar + myOtherVar"
</child-component>
angular.module('heroApp').component('childComponent', {
template: "<div>{{ $ctrl.parentFoo({myVar:5, myOtherVar:'xyz'}) }}</div>",
bindings: {
parentFoo: '&foo'
}
});
Cho parentVar=10
, biểu thức parentFoo({myVar:5, myOtherVar:'xyz'})
sẽ ước tính 5 + 10 + 'xyz'
và thành phần sẽ hiển thị là:
<div>15xyz</div>
Khi nào bạn muốn sử dụng chức năng phức tạp này? &
thường được mọi người sử dụng để chuyển đến phạm vi con một hàm gọi lại trong phạm vi cha. Tuy nhiên, trong thực tế, hiệu ứng tương tự có thể đạt được bằng cách sử dụng '<' để truyền hàm, điều này đơn giản hơn và tránh cú pháp dấu ngoặc nhọn khó xử để truyền tham số ( {myVar:5, myOtherVar:'xyz'}
). Xem xét:
Gọi lại bằng cách sử dụng &
:
<child-component parent-foo="$ctrl.foo(bar)"/>
angular.module('heroApp').component('childComponent', {
template: '<button ng-click="$ctrl.parentFoo({bar:'xyz'})">Call foo in parent</button>',
bindings: {
parentFoo: '&'
}
});
Gọi lại bằng cách sử dụng <
:
<child-component parent-foo="$ctrl.foo"/>
angular.module('heroApp').component('childComponent', {
template: '<button ng-click="$ctrl.parentFoo('xyz')">Call foo in parent</button>',
bindings: {
parentFoo: '<'
}
});
Lưu ý rằng các đối tượng (và mảng) được truyền bằng tham chiếu đến phạm vi con, không được sao chép. Điều này có nghĩa là ngay cả khi đó là ràng buộc một chiều, bạn đang làm việc với cùng một đối tượng trong cả phạm vi cha và con.
Để xem các tiền tố khác nhau đang hoạt động, hãy mở plunk này .
Liên kết một lần (khởi tạo) bằng cách sử dụng
::
[Tài liệu chính thức] Các
phiên bản sau của AngularJS giới thiệu tùy chọn có ràng buộc một lần, trong đó thuộc tính phạm vi con chỉ được cập nhật một lần. Điều này cải thiện hiệu suất bằng cách loại bỏ nhu cầu xem tài sản mẹ. Cú pháp khác với ở trên; để khai báo ràng buộc một lần, bạn thêm ::
vào trước biểu thức trong thẻ thành phần :
<child-component
tagline = "::$ctrl.tagline">
</child-component>
Điều này sẽ tuyên truyền giá trị của tagline
phạm vi con mà không thiết lập ràng buộc một chiều hoặc hai chiều. Lưu ý : nếu tagline
ban đầu undefined
trong phạm vi cha, angular sẽ xem nó cho đến khi nó thay đổi và sau đó thực hiện cập nhật một lần của thuộc tính tương ứng trong phạm vi con.
Tóm lược
Bảng dưới đây cho thấy cách các tiền tố hoạt động tùy thuộc vào việc thuộc tính có phải là một đối tượng, mảng, chuỗi, v.v.