11

Tôi đang sử dụng socket.io để bật trò chuyện trong ứng dụng của mình và đang sử dụng dịch vụ SocketService để thực hiện tất cả các công cụ ổ cắm. Khi một tin nhắn đến sau đó tôi muốn kích hoạt một chức năng của bộ điều khiển từ dịch vụ SocketService để thực hiện một số thay đổi trong giao diện người dùng. Vì vậy, tôi muốn biết rằng làm thế nào tôi có thể truy cập chức năng của bộ điều khiển từ dịch vụ. Mã mẫu:Chức năng điều khiển cuộc gọi từ dịch vụ trong angularjs

.service('SocketService', function ($http,$rootScope,$q) { 
    this.connect = function(){ 
    var socket = io(); 
    socket.on('connect',function(){ 
     // Call a function named 'someFunction' in controller 'ChatController' 
    }); 
    } 
}); 

Đây là mã mẫu cho dịch vụ.

Bây giờ mã cho điều khiển

.controller('ChatController',function('SocketService',$scope){ 
    $scope.someFunction = function(){ 
    // Some Code Here 
    } 
}); 
+0

[http://stackoverflow.com/questions/20621028/angularjs-calling-a-controller-function-from-a-service][1] [1]: http: //stackoverflow.com/questions/20621028/angularjs-calling-a-controller-function-from-a-service – TechnoCrat

Trả lời

29

Bạn có thể đạt được điều này bằng cách sử dụng các sự kiện góc $broadcast hoặc $emit.

Trong trường hợp của bạn $broadcast sẽ là hữu ích, Bạn cần phải quảng bá sự kiện của bạn trong $rootscope có thể được lắng nghe bởi tất cả các phạm vi con trong đó có $on với tên sự kiện tương tự.

.service('SocketService', function($http, $rootScope, $q) { 
    this.connect = function() { 
     var socket = io(); 
     socket.on('connect', function() { 
      // Call a function named 'someFunction' in controller 'ChatController' 
      $rootScope.$broadcast('eventFired', { 
       data: 'something' 
      }); 
     }); 
    } 
}); 


.controller('ChatController', function('SocketService', $scope) { 
    $scope.someFunction = function() { 
     // Some Code Here 
    } 
    $scope.$on('eventFired', function(event, data) { 
     $scope.someFunction(); 
    }) 
}); 

Hy vọng điều này có thể giúp bạn, Cảm ơn bạn.

+0

Cảm ơn @pankajparkar $ phát sóng hoạt động ở đây một cách hoàn hảo. –

+0

@VinitChouhan cool, Vui mừng được giúp bạn, Cảm ơn :) Happy Coding –

+1

@PankajParkar: Giải pháp hoàn hảo cho vấn đề của tôi là tốt. Trong trường hợp của tôi các bộ điều khiển không được lồng nhau và tôi phải gửi cập nhật từ người khác. Nó giống như Ramban Ilaaj. –

1

Tôi biết đây là một câu hỏi cũ, nhưng tôi có một tùy chọn khác. Tôi có một khuynh hướng cá nhân so với phát sóng $ - nó chỉ không cảm thấy rất 'angularish', tôi thích thực hiện các cuộc gọi rõ ràng trong mã của tôi.

Vì vậy, thay vì phát sóng tới bộ điều khiển và kích hoạt chu trình tiêu hóa khác, tôi muốn người điều khiển tự đăng ký dịch vụ, như dưới đây. Chỉ cần cẩn thận không giới thiệu bất kỳ phụ thuộc vòng tròn nào nếu bộ điều khiển sử dụng cùng một dịch vụ. Điều này làm việc tốt nhất với cú pháp controllerAs, do đó dịch vụ gọi điện không cần quan tâm đến phạm vi $.

Có, đây là mã nhiều hơn $ phát, nhưng nó cung cấp toàn quyền truy cập dịch vụ cho toàn bộ bộ điều khiển - tất cả các phương thức và thuộc tính của nó.

.service('SocketService', function ($http,$rootScope,$q) { 
    var _this = this;  
    this.chatController = null; 
    this.registerCtrlr = function (ctrlr) { 
    _this.chatController = ctrlr; 
    }; 
    this.unRegisterCtrlr = function() { 
    _this.chatController = null; 
    }; 

    this.connect = function(){ 
    var socket = io(); 
    socket.on('connect',function(){ 
     // Call chatController.someFunction if chatController exists 
     if (_this.chatController) { 
     _this.chatController.someFunction(); 
     } 
    }); 
    }; 
}); 

.controller('ChatController',['SocketService', '$scope', function(SocketService, $scope){ 
    SocketService.registerCtrlr(this); 
    //-- make sure controller unregisters itself when destroyed - need $scope for this 
    $scope.$on('$destroy', function() { 
    SocketService.unRegisterCtrlr(); 
    }); 
    this.someFunction = function(){ 
    // Some Code Here 
    } 
}]); 
+0

Tại sao phải thêm toàn bộ Bộ điều khiển? Chỉ cần đăng ký chức năng cụ thể. Hãy nhớ rằng nếu bên trong hàm, phạm vi $ (hoặc vm) được sửa đổi, hãy thông báo thay đổi cho khung nhìn với [$ scope.apply như một trình bao bọc] (http://jimhoskins.com/2012/12/17/angularjs-and -apply.html) –

+0

Các điểm tốt, với một vài lưu ý: a) khi đăng ký chức năng cụ thể, hãy chắc chắn chỉ ra bộ điều khiển mà nó bị ràng buộc - 'SocketService.registerCtrlrFn (this.someFunction.bind (this)', và b) nếu logic dịch vụ đã luôn chạy như một phần của chu trình phân hủy, thì trình bao bọc $ scope.apply không cần thiết. Nếu logic dịch vụ không phải là một phần của chu kỳ tiêu hóa, như trong câu hỏi ban đầu, nó là cần thiết. Nếu nó có thể hoặc có thể không nằm trong chu kỳ phân hủy, hãy sử dụng trình bao bọc $ timeout thay thế. – grumpyhoser

+0

Thông tin thêm về [$ scope.áp dụng vs $ timeout] (http://stackoverflow.com/questions/23070822/angular-scope-apply-vs-timeout-as-a-safe-apply) – grumpyhoser

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