Tại sao chúng tôi sử dụng $ rootScope. $ Broadcast trong AngularJS?


109

Đã cố gắng tìm một số thông tin cơ bản cho AngularJS $rootScope.$broadcast, nhưng tài liệu AngularJS không giúp được gì nhiều. Nói một cách dễ hiểu tại sao chúng ta sử dụng cái này?

Ngoài ra, bên trong mẫu Khăn nóng của John Papa có một chức năng tùy chỉnh trong mô-đun chung có tên $broadcast:

function $broadcast() {
    return $rootScope.$broadcast.apply($rootScope, arguments);
}

Tôi không hiểu điều này đang làm gì. Vì vậy, đây là một số câu hỏi cơ bản:

1) Làm gì $rootScope.$broadcast?

2) Sự khác biệt giữa $rootScope.$broadcastvà là $rootScope.$broadcast.applygì?




$rootScope.$broadcast.apply()được sử dụng bởi vì nếu bạn muốn truyền argumentsđối tượng đặc biệt cho một hàm khác, bạn cần phải sử dụng apply()(trái ngược với call()). Ngoài liên kết của @ Blackhole đến trang MDN được áp dụng, bạn cũng có thể xem mục trên arguments.
Scott Schupbach

Câu trả lời:


97
  1. Làm gì $rootScope.$broadcast?

    $rootScope.$broadcastđang gửi một sự kiện thông qua phạm vi ứng dụng. Bất kỳ trẻ em phạm vi ứng dụng có thể bắt nó bằng cách sử dụng đơn giản: $scope.$on().

    Đặc biệt hữu ích khi gửi các sự kiện khi bạn muốn tiếp cận phạm vi không phải là cấp cha mẹ trực tiếp (Ví dụ: một nhánh của cấp độ cha mẹ)

    !!! Tuy nhiên, một điều không nên làm là sử dụng $rootScope.$ontừ bộ điều khiển. $rootScopelà ứng dụng, khi bộ điều khiển của bạn bị phá hủy, bộ xử lý sự kiện đó sẽ vẫn tồn tại và khi bộ điều khiển của bạn được tạo lại, nó sẽ chỉ chồng chất thêm bộ nghe sự kiện. (Vì vậy, một chương trình phát sóng sẽ bị bắt nhiều lần). Sử dụng $scope.$on()thay thế, và người nghe cũng sẽ bị phá hủy.

  2. Sự khác biệt giữa $rootScope.$broadcast& $rootScope.$broadcast.apply?

    Đôi khi bạn phải sử dụng apply(), đặc biệt là khi làm việc với các chỉ thị và các thư viện JS khác. Tuy nhiên, vì tôi không biết cơ sở mã đó, tôi sẽ không thể biết liệu đó có phải là trường hợp ở đây hay không.


11
Bắt tuyệt vời về $rootScope.$onrò rỉ bộ nhớ. Điều này cũng áp dụng cho câu trả lời được chấp nhận, vì bộ điều khiển có thể gọi câu trả lời hiEventServicemà anh ta đã tạo.
adamdport

Ví dụ trong đó bạn sẽ sử dụng là gì $broadcastso với$broadcast.apply()
khách

$ rootScope. $ broadcast gửi sự kiện tới tất cả người nghe, không chỉ người nghe từ phạm vi trẻ em. $ scope. $ broadcast giới hạn sự kiện trong phạm vi trẻ em
Geert Bellemans 22/03/17

157

$rootScope về cơ bản hoạt động như một người nghe và điều phối sự kiện.

Để trả lời câu hỏi nó được sử dụng như thế nào, nó được sử dụng kết hợp với rootScope.$on;

$rootScope.$broadcast("hi");

$rootScope.$on("hi", function(){
    //do something
});

Tuy nhiên, bạn không nên sử dụng $rootScopelàm dịch vụ sự kiện chung cho ứng dụng của mình, vì bạn sẽ nhanh chóng rơi vào tình huống mọi ứng dụng phụ thuộc vào $ rootScope và bạn không biết thành phần nào đang lắng nghe sự kiện nào.

Cách tốt nhất là tạo một dịch vụ cho từng sự kiện tùy chỉnh mà bạn muốn nghe hoặc phát.

.service("hiEventService",function($rootScope) {
    this.broadcast = function() {$rootScope.$broadcast("hi")}
    this.listen = function(callback) {$rootScope.$on("hi",callback)}
})

4
Cảm ơn @itcouldevenbeabout dòng này không gọi cùng một logic là đính kèm một sự kiện vào $ rootScope toàn cầu sao? function () {$ rootScope. $ broadcast ("hi")}, mà bạn đã đề cập là một phương pháp không tốt?
Nexus

11
Sử dụng một dịch vụ để thực hiện các chương trình phát sóng và cũng đính kèm người nghe cho một sự kiện cụ thể sẽ tránh được tình huống bạn không chắc ai đang nghe. Nó trở nên rõ ràng các thành phần có dịch vụ sự kiện như một phụ thuộc
CoolTapes

4
Sau khi phát hiện ra sự khác biệt giữa $ phát và $ phát sóng, tôi có xu hướng nói rằng sẽ tốt hơn nếu $ phát ra sự kiện - theo cách đó, sự kiện gây ô nhiễm cho bạn trong tập hợp phạm vi nhỏ nhất có thể, (lý tưởng là dịch vụ sẽ có đó là phạm vi riêng, nhưng tôi không nghĩ điều đó có thể xảy ra?)
Brondahl

3
-1. Tôi không hiểu, cô lập trong một dịch vụ tốt hơn như thế nào so với chỉ đơn giản là phát sóng. Dù sao, tốt hơn hãy sử dụng phạm vi riêng tư của riêng mình trong dịch vụ. Và tốt hơn hãy sử dụng $ phát ra, chứ không phải $ phát sóng. Ngoài ra dịch vụ được đề xuất của bạn không hỗ trợ các đối số sự kiện. Điều tệ hơn là nó không hỗ trợ hủy đăng ký; tội trọng cho $ rootScope.
alpha-mouse

3
Việc thiếu lượt hủy đăng ký làm hỏng câu trả lời này cho tôi. Nếu bạn gọi hiEventService.listen(callback)từ một bộ điều khiển, người nghe sẽ vẫn tồn tại ngay cả sau khi bộ điều khiển bị phá hủy. Bộ nhớ bị rò rỉ! Ràng buộc với phạm vi bộ điều khiển $scope.$on("hi",callback)đi kèm với tính năng dọn dẹp tự động.
adamdport

32

$ rootScope. $ broadcast là một cách thuận tiện để nâng cao sự kiện "toàn cầu" mà tất cả các phạm vi con đều có thể lắng nghe. Bạn chỉ cần sử dụng $rootScopeđể phát tin nhắn, vì tất cả các phạm vi con cháu đều có thể nghe nó.

Phạm vi gốc phát sự kiện:

$rootScope.$broadcast("myEvent");

Bất kỳ Phạm vi con nào cũng có thể lắng nghe sự kiện:

$scope.$on("myEvent",function () {console.log('my event occurred');} );

Tại sao chúng tôi sử dụng $ rootScope. $ Broadcast? Bạn có thể sử dụng $watchđể lắng nghe các thay đổi của biến và thực thi các hàm khi trạng thái của biến thay đổi. Tuy nhiên, trong một số trường hợp, bạn chỉ muốn nêu ra một sự kiện mà các phần khác của ứng dụng có thể lắng nghe, bất kể thay đổi nào về trạng thái biến phạm vi. Đây là khi $broadcasthữu ích.


19

Truyền dữ liệu !!!

Tôi tự hỏi tại sao không ai đề cập đến việc $broadcastchấp nhận một tham số nơi bạn có thể truyền một tham số Objectsẽ được nhận bằng $oncách sử dụng hàm gọi lại

Thí dụ:

// the object to transfert
var myObject = {
    status : 10
}

$rootScope.$broadcast('status_updated', myObject);
$scope.$on('status_updated', function(event, obj){
    console.log(obj.status); // 10
})

8

$ RootScope. $ Broadcast làm gì?

Nó truyền thông điệp đến những người nghe tương ứng trên khắp ứng dụng góc cạnh, một phương tiện rất mạnh mẽ để truyền thông điệp đến các phạm vi ở cấp độ phân cấp khác nhau (có thể là cha mẹ, con cái hoặc anh chị em)

Tương tự, chúng ta có $ rootScope. $ Release, sự khác biệt duy nhất là cái trước cũng bị bắt bởi $ scope. $ On trong khi cái sau chỉ bị $ rootScope. $ On.

tham khảo các ví dụ: - http://toddmotto.com/all-about-angulars-emit-broadcast-on-publish-subscriping/

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.