@Josh đề cập trong câu trả lời của ông rằng
Giải pháp tốt nhất kể từ directiveB
-like thành phần của bạn được dự kiến sẽ được sử dụng trong vòng directiveA
thành phần là sử dụng require
.
Tôi đã đùa giỡn với điều này và tôi tin rằng một bộ điều khiển trên directiveA
là chỉ giải pháp (do 1 Josh). Đây là những gì các phạm vi trông giống như sử dụng violon của OP: (. Đảo ngược vào mũi tên màu nâu và bạn có $$ previousSibling thay vì $$ nextSibling)
Ngoài $$previousSibling
, phạm vi 004 không có con đường để cô lập phạm vi 003.Lưu ý rằng phạm vi 004 là phạm vi được chuyển đổi mà directiveA
tạo và từ directiveB
không tạo phạm vi mới, phạm vi này cũng được sử dụng bởi directiveB
.
Vì đối tượng bạn muốn chia sẻ với directiveB
đang được tạo trong bộ điều khiển của directiveA
, chúng tôi cũng không thể sử dụng thuộc tính để chia sẻ dữ liệu giữa các chỉ thị.
Tạo mô hình bên trong chỉ thị và sau đó chia sẻ mô hình đó với thế giới bên ngoài là không điển hình. Thông thường, bạn sẽ muốn xác định các mô hình của mình bên ngoài chỉ thị của bạn và thậm chí bên ngoài bộ điều khiển của bạn (listen for a few minutes to Misko). Dịch vụ thường là nơi tốt để lưu trữ các mô hình/dữ liệu của bạn. Bộ điều khiển thông thường nên tham khảo các phần của (các) mô hình cần được chiếu vào dạng xem mà chúng được liên kết với.
Để đơn giản, tôi sẽ xác định mô hình trên bộ điều khiển, sau đó các chỉ thị sẽ truy cập cả hai mô hình này theo cách thông thường. Đối với mục đích sư phạm, directiveA
sẽ vẫn sử dụng phạm vi cách ly và directiveB
sẽ tạo phạm vi con mới bằng cách sử dụng scope: new
như trong câu trả lời của @ Josh. Nhưng bất kỳ kiểu nào (cô lập, con mới, không có phạm vi mới) và kết hợp sẽ hoạt động, bây giờ chúng ta có mô hình được định nghĩa trong một phạm vi cha mẹ.
Ctrl:
$scope.model = {value: '#33ff33', checkedState = true};
HTML:
<div ng-controller="NoTouchPrevSibling">
<div data-directive-a data-value="model.value" data-checked="model.checkedState">
<div data-directive-b></div>
</div>
Vì lý do sư phạm khác, tôi đã lựa chọn để vượt qua directiveA hai thuộc tính mô hình như là thuộc tính riêng biệt, nhưng toàn bộ mô hình/đối tượng cũng có thể đã được thông qua. Vì directiveB sẽ tạo ra một phạm vi con, nó không cần truyền bất kỳ thuộc tính nào vì nó có quyền truy cập vào tất cả các thuộc tính phạm vi cha/bộ điều khiển.
Chỉ:
app.directive('directiveA', function() {
return {
template: '<div>'
+ 'inside parent directive: {{checkedState}}'
+ '<input type="checkbox" ng-model="checkedState" />'
+ '<div ng-transclude></div>'
+ '</div>',
transclude: true,
replace: true,
scope: {
value: '=',
checkedState: '=checked'
},
};
});
app.directive('directiveB', function() {
return {
template: '<div>'
+ '<span>inside transcluded directive: {{model.checkedState}}</span>'
+ '<input type="text" ng-model="model.value" />'
+ '</div>',
replace: true,
scope: true
};
});
Scopes:
Lưu ý rằng phạm vi con directiveB của (006) được thừa hưởng từ phạm vi nhúng directiveA của (005).
Sau khi nhấp vào hộp kiểm và thay đổi giá trị trong hộp văn bản:
Lưu ý rằng tay cầm Góc cập nhật các thuộc tính phạm vi cô lập. Bình thường JavaScript prototypal inheritance cho phép truy cập phạm vi con của directiveB vào model
trong phạm vi bộ điều khiển (003).
Fiddle
tôi khuyên bạn nên sử dụng đòi hỏi phải định nghĩa trong chỉ thị và thông qua bộ điều khiển cha mẹ để điều khiển con –
Tại sao có những chỉ thị ở tất cả xem xét họ không làm bất cứ điều gì? Nếu chúng chỉ minh họa cho vấn đề, các chỉ thị này * luôn luôn * được sử dụng cùng nhau hoặc chúng có thể được sử dụng riêng biệt?Bạn có muốn chỉ thịB được chuyển đổi luôn trong tham chiếu đến phạm vi của chỉ thịA thay vì một con mới của cha/mẹ không? Tại sao directiveA có một phạm vi cô lập nhưng directiveB tuyên bố không có phạm vi mới nào cả? –
@JoshDavidMiller Tôi đã thêm chiều sâu hơn một chút vào mô tả ở trên. Đối với không có phạm vi được khai báo trên 'B' và phạm vi cô lập trên' A' - tôi không có nó được thiết lập theo cách đó vì bất kỳ lý do cụ thể nào. Tất cả những gì tôi biết là tôi cần chuyển một số dữ liệu từ DOM sang chỉ thị và cách tốt nhất có vẻ là 'phạm vi: {xxx: '@'}' – jlb