2013-07-13 5 views
5

Tôi đang sử dụng angular-js. Tôi có một dịch vụ cần kích hoạt sự kiện mỗi khi có điều gì đó xảy ra. Để làm điều đó tôi cần một đối tượng sẽ hoạt động như event aggregator.

  1. Tôi có cần phải tạo tài khoản không? Hoặc tôi có nên sử dụng số $rootScope không?
  2. Trong trường hợp tôi nên sử dụng $rootScope, làm cách nào để đảm bảo rằng không có xung đột tên sự kiện?
  3. Có hiệu quả khi sử dụng $rootScope cho các sự kiện không cần chúng để truyền tới phạm vi con không?
+0

Bạn có ý nghĩa gì bởi * tổng hợp sự kiện *? Đây có phải là điểm trung tâm để phát sóng sự kiện không? Bạn có muốn tất cả người nghe nối tới bộ tổng hợp * sự kiện * trực tiếp không? – yuxhuang

+0

Có. Event aggregator là một đối tượng trung tâm để phát các sự kiện và các đối tượng khác lắng nghe nó. Ví dụ, một dịch vụ cần phát sóng một sự kiện 'action', nó sẽ gọi vent.trigger ('action'); và các đối tượng khác thực hiện vent.on ('hành động', gọi lại); sẽ thực thi cuộc gọi lại của họ. – Naor

Trả lời

13

tôi mô hình hóa và thực hiện các cơ chế sau đây trong một dự án web cho máy tính bảng:

  1. D efine thông báo trong các dịch vụ của bạn. Tôi không muốn sử dụng thuật ngữ sự kiện vì tôi không muốn nó bị nhầm lẫn với sự kiện DOM của các nhà phát triển khác trong nhóm của tôi. Và một tên được đánh máy bán cho một thông báo sẽ dễ dàng hơn cho IDE với sự hỗ trợ intellisense và để gỡ lỗi. Ví dụ: tôi có một dịch vụ Device sẽ $broadcast(Device.Notification.OrientationDidChange) khi định hướng của thiết bị máy tính bảng được thay đổi.

  2. Sử dụng Scope đối tượng để $broadcast hoặc $emitthông báo, tùy thuộc vào nhu cầu của bạn. Ví dụ,

    • cho thông báo toàn cầu như trước đó, tôi làm: $rootScope.$broadcast(Device.Notification.OrientationDidChange). Vì vậy, tất cả người nghe có thể nghe trên phạm vi của riêng mình mà không cần tiêm $rootScope.
    • Đối với thông báo địa phương mà có thể chỉ ảnh hưởng đến phạm vi hiện tại (và con của nó), chẳng hạn như thông báo mà phạm vi cần thông báo cho tất cả các phạm vi con của bố cục của bộ điều khiển hiện tại. làm: scope.$broadcast(UI.Notification.NeedsLayout), trong đó UI là dịch vụ được xác định trước để giữ các hằng số liên quan đến giao diện người dùng và scope là phạm vi hiện tại.
    • Đối với một số thông báo nhất định mà phạm vi con cần gửi lên, ví dụ như chỉ dẫn thanh trượt cho biết giá trị rangeStart đã thay đổi (ngoài ràng buộc hai chiều thông thường), tôi sử dụng: scope.$emit(Slider.Notification.RangeStartDidChange), trong đó scope là phạm vi hiện tại.
  3. Cách tiếp cận này có chút chi tiết trong một dự án nhỏ. Bạn có thể muốn sử dụng $rootScope.$emit(Notification) mọi lúc và để tất cả người nghe thực hiện $rootScope.$on(Notification, callback) để nhận các thông báo này.

  4. Trong một số trường hợp, bạn có thể muốn xác định các thông báo này trong dịch vụ tập trung để dễ dàng tránh xung đột tên. Nó thực sự dựa trên quy ước đặt tên của dự án của bạn.

  5. Việc triển khai (giá trị thực tế) của các thông báo này có thể thay đổi. Tôi thích sử dụng strings.

  6. Với $broadcast hoặc $emit bạn cũng có thể thực sự chuyển đối số bổ sung cho người nghe, ví dụ: $broadcast(Notification, arg1, arg2) ... Angular's documentation khá chi tiết.

4

Hãy xem http://docs.angularjs.org/api/ng.$rootScope.Scope#$broadcast.

  1. Sử dụng $rootScope như sự kiện aggregator là hoàn toàn tốt đẹp, trừ khi bạn đang kích hoạt sự kiện outslide digest cycle hoặc kích hoạt nhiều (100) sự kiện cùng lúc, nơi một số giải pháp khác có thể thích hợp hơn.
  2. Một thực tế được chấp nhận sẽ được sử dụng không gian tên (namespace:event - mô hình được sử dụng bởi Backbone.Marionette)
  3. Sử dụng $emit trên một phạm vi con thay vì $broadcast trên $rootScope-$emit truyền chỉ trở lên, nơi $broadcast truyền xuống - để tất cả trẻ em
+0

Câu trả lời hay. Điểm đáng lưu ý: trên $ rootScope, $ broadcast và $ emit sẽ thực hiện việc lấy mẫu cơ bản. Vì đó là "gốc". –

+0

@blesh Tôi không nghĩ đó là chính xác, trên '$ rootScope',' $ emit' sẽ kích hoạt chỉ ở đó (vì không có bất kỳ mức tăng nào), trong khi '$ broadcast' sẽ truyền đến mọi' phạm vi' trong ứng dụng của bạn (là kẻ giết người hiệu suất). – yorch

+0

3. kém phát âm. Tôi có nghĩa là để nói "được sử dụng $ phát ra từ một phạm vi con thay vì $ phát sóng trên $ rootScope". Tôi không đủ cụ thể. –