2013-05-10 17 views
31

tôi đã có thể nhận được bộ điều khiển để sử dụng $ trên người nghe với $scope.$on.

nhưng tôi không thấy bất kỳ tài liệu nào về cách nhận dịch vụ để lắng nghe sự kiện.

Tôi đã thử $rootScope.$on, nhưng điều đó chỉ cho phép một người nghe. tôi muốn người nghe trong nhiều dịch vụ bất kể bộ điều khiển cha mẹ của họ có nằm trong phạm vi hay không.

+0

Tại sao bạn không chỉ đơn giản là tiêm dịch vụ vào điều khiển và để điều khiển cuộc gọi phương thức dịch vụ. Bạn không cần sử dụng bất kỳ sự kiện nào. (BTW, dịch vụ sẽ không được tạo nếu bạn không tiêm vào thứ gì đó ...) – Tosh

+0

Tôi có nhiều bộ điều khiển và mỗi bộ điều khiển đều có dịch vụ, tất cả các dịch vụ cần được thông báo. không chỉ là bộ điều khiển đang hoạt động – Anton

+0

@Anton: Các dịch vụ là các trình đơn mặc định - vì vậy việc thay đổi một biến dịch vụ trong một bộ điều khiển sẽ thay đổi nó ở mọi nơi (kể từ cùng một đối tượng). – ganaraj

Trả lời

45

sau khi thử nghiệm một chút công bằng, hóa ra việc nhận sự kiện cho dịch vụ có thể được thực hiện bằng mã tối thiểu.

mã dịch vụ mẫu sau trong trường hợp bất kỳ ai khác thực hiện điều này.

Mẫu tiết kiệm và phục hồi các mô hình dịch vụ để lưu trữ địa phương khi nó được phát sóng tương ứng

app.factory('userService', ['$rootScope', function ($rootScope) { 

    var service = { 

     model: { 
      name: '', 
      email: '' 
     }, 

     SaveState: function() { 
      sessionStorage.userService = angular.toJson(service.model); 
     }, 

     RestoreState: function() { 
      service.model = angular.fromJson(sessionStorage.userService); 
     } 
    } 

    $rootScope.$on("savestate", service.SaveState); 
    $rootScope.$on("restorestate", service.RestoreState); 

    return service; 
}]); 
+1

Tôi là người duy nhất nhận ra điều này về mặt kỹ thuật là một đối tượng của nhà máy .... nó không gọi một nhà xây dựng dịch vụ với 'app.service ('myActualService', ...)' – BradGreens

+0

@BradGreens, tôi thấy điều đó làm tôi bối rối app.factory được liệt kê là "một cách" để xác định các dịch vụ trong góc. hạnh phúc được thể hiện đúng cách để làm điều đó nếu điều này là không chính xác – Anton

+0

Vâng, tôi ở bên bạn. Tôi chủ yếu là người dùng 'app.service' cho những người độc thân thực sự sử dụng các thuộc tính' this'. Tôi có thể chụp ảnh trực tiếp việc chuyển “nhà máy” này sang 'dịch vụ' vào ngày mai với hy vọng nó giúp phác thảo sự khác biệt. Thành thật mà nói, tôi có thể trao đổi mọi dịch vụ với một nhà máy trong ứng dụng của tôi và không thấy sự khác biệt trong kết quả cuối cùng. – BradGreens

14

Kể từ $on là một phương pháp phạm vi, bạn có thể tạo một phạm vi phục vụ của bạn, sau đó lắng nghe cho các sự kiện trên đó:

app.factory('myService', function($rootScope) { 
    var scope = $rootScope.$new(); // or $new(true) if you want an isolate scope 
    scope.$on('testEvent', function() { 
     console.log('event received'); 
    }) 
    return {} 
}); 

function MyCtrl($scope, myService, $rootScope) { 
    $rootScope.$broadcast('testEvent'); 
} 

fiddle

Tuy nhiên, tôi sẽ không khuyên bạn nên phương pháp này, vì phạm vi thường không được liên kết với các dịch vụ.

+2

đồng ý, sử dụng một phạm vi trong một dịch vụ có vẻ tò mò – Anton

+0

Nếu bạn không khuyên bạn nên cách tiếp cận này, bạn sẽ làm gì để thay thế? – marcel

+0

@marcel, tôi thích cách tiếp cận/câu trả lời của Anton. (Khi tôi lần đầu tiên viết câu trả lời này, tôi không thể nghĩ ra cách nào tốt hơn.) –

Các vấn đề liên quan