Tôi tự hỏi nếu bạn có ví dụ về mã chỉ thị phản ứng trên các sự kiện góc như $routeChangeError
mà không cần tiêm $rootScope
vào nó (để sử dụng $on
trong hàm liên kết). Nó phá vỡ trong mô hình MV * ý kiến của tôi và "tạo ra" mã mùi (cho khả năng điều khiển phạm vi gốc trong một chỉ thị). Cảm ơn trước.
Trả lời
Nếu bạn chỉ đang nghe các sự kiện, bạn không phải sử dụng số $rootScope
; làm ví dụ $scope.$on("$routeChangeError")
trên phạm vi của chỉ thị, từ bộ điều khiển hoặc chức năng liên kết.
Bạn thấy số "$routeChangeError"
được phát sóng từ $rootScope
, vì vậy tất cả trẻ em đều nhận được.
Không. Không có cách nào để nghe sự kiện Góc mà không có quyền truy cập vào $scope
. Đó là một trong những lý do chính họ có dịch vụ $rootScope
, để bạn có thể truy cập vào $scope
khi đang ở trong một dịch vụ hoặc một số mô-đun khác.
Tuy nhiên, theo chỉ thị, bạn không cần phải tiêm $rootScope
vì bạn đã có phạm vi cách ly trong chỉ thị trong hàm liên kết.
Ví dụ:
.directive('myDirective', function(){
return {
restrict: 'A',
link: function(scope, elem, attrs){
scope.$on('some-event', function(e){
// respond to event here
});
}
};
});
biến scope
của bạn là một "cô lập" phạm vi nên không thể ảnh hưởng đến phạm vi mẹ của nó trong bất kỳ cách nào. Tuy nhiên, điều này có một số tác dụng phụ lạ nếu bạn đang cố gắng phát ra một sự kiện cho một số mô-đun cấp độ chị em, bởi vì các sự kiện Góc chỉ $emit
trở lên hoặc $broadcast
xuống dưới thông qua phân cấp phạm vi. Nếu không, thì ví dụ trên sẽ hoạt động hoàn hảo. Nếu bạn đang có, sau đó ví dụ sau đây là một cách để làm điều đó:
.directive('myDirective', function($rootScope){
var isolateScope = $rootScope.new(); // creates a new isolate copy of $rootScope
return {
restrict: 'A',
link: function(scope, elem, attrs){
isolateScope.$on('some-event', function(e){
// respond to event here
});
}
};
});
này sẽ tạo ra một bản sao cô lập tương tự $rootScope
để cho bất kỳ thay đổi bạn thực hiện cho nó sẽ không ảnh hưởng đến các module hoặc các dịch vụ khác. Điều này sẽ ngăn chặn bất kỳ vấn đề nào với "smell-code"
như bạn đã gọi.
$on
phương pháp được định nghĩa trên nội Scope.prototype
, và vì mỗi phạm vi trong góc được tạo ra từ Scope
constructor này có nghĩa là mỗi phạm vi có một phương pháp $on
sẵn trên chính nó. Không cần phải tiêm $rootScope
, chỉ cần gọi phương thức $on
trên chỉ thị liên kết phạm vi chức năng của trực tiếp:
app.directive('myDirective', function(){
return function(scope, element, attrs){
scope.$on('$routeChangeError', function(){
// ...
});
}
});
- 1. Ngăn chặn trạng tháiThay đổi với bộ định tuyến ui góc mà không cần sử dụng $ rootScope
- 2. $ rootScope là tập hợp sự kiện
- 3. Kiểm tra Góc $ emit và $ trên các sự kiện
- 4. Chỉ thị góc không hiển thị trong ứng dụng ionic
- 5. Góc $ rootScope. $ Trên Chưa xác định
- 6. Gắn kết sự kiện với $ (tài liệu) bên trong chỉ thị góc
- 7. AngularJS tổ chức sự kiện không bắn từ $ rootScope
- 8. Sự kiện FullCalendar không chỉ hiển thị trên Safari
- 9. Phản ứng sự kiện onClick trên thành phần
- 10. Chỉ cần tiêm một số hàm tạo
- 11. Phản ứng không đáp ứng với sự kiện quan trọng
- 12. Giao tiếp sự kiện Angularjs giữa các chỉ thị với xuất bản/đăng ký
- 13. Chỉ thị góc: Có thể kiểm tra các ký tự nhất định bị từ chối trong sự kiện nhấn phím?
- 14. Tiêm các sự kiện trên màn hình cảm ứng , Android 5.0 , dev/input/eventX
- 15. Sự kiện liên kết xương sống trên một góc nhìn
- 16. angularjs: cập nhật biến $ rootScope từ chỉ thị
- 17. Phản ứng: Cách nghe các sự kiện thành phần con
- 18. Loại bản ghi: Các loại sự kiện phản ứng
- 19. Chúng ta có cần hủy liên kết trình lắng nghe sự kiện trong các chỉ thị khi góc bắt đầu phá hủy không?
- 20. C# set UserControl.Value mà không cần gọi sự kiện ValueChanged
- 21. Xử lý sự kiện từ Nhật ký Sự kiện và phản ứng trên một mẫu nhất định (Rx?)
- 22. Cách đặt checkbox.isChecked mà không cần tăng sự kiện
- 23. Khi nào cần viết một chỉ thị?
- 24. Thực tiễn không tốt khi sử dụng $ áp dụng khi cập nhật dữ liệu trong một chỉ thị cần được phản ánh trong một chỉ thị khác?
- 25. Góc - phát sóng, $ được gọi nhiều lần theo chỉ thị
- 26. định tuyến góc trên ios9 $ rootScope: lỗi infdig
- 27. Chỉ cần hai góc tròn?
- 28. Cách phản hồi để định tuyến mà không cần hiển thị lại
- 29. phần tiêm điều khiển góc vấn đề
- 30. Chỉ thị góc không hiển thị
Liệu nó có nghĩa rằng giải pháp thể hiện bởi John Lindquist trong hướng dẫn của ông http://egghead.io/lessons/angularjs- chỉ thị-cho-tuyến-xử lý chỉ đơn giản là ** xấu thiết kế ** (_Use AngularJS $ rootScope trong một chỉ thị để phát hiện lỗi thay đổi tuyến đường và hiển thị nó cho user_)? Trên thực tế video này là kích hoạt của câu hỏi của tôi. –