2016-09-08 5 views
1

에서 이벤트 리스너를 파괴한다. 이제 $scope.$on('$destroy')에 액세스하여 $rootScope 수신기를 등록 취소 할 수 있는지 여부를 모르겠다는 것입니다.내가이 공장을 쓴 AngularJS와 서비스

누구에 대해서도 조언이 있습니까? 이 장식한다 등 을 $에

angular.module('app').config(['$provide', function ($provide) { 
        $provide.decorator('$rootScope', function ($delegate) { 
         var _emit = $delegate.$emit; 
         var _broadcast = $delegate.$broadcast; 
         var _on = $delegate.$on; 

         $delegate.$emit = function() { 
          $log.debug('emit', arguments); 
          return _emit.apply(this, arguments); 
         }; 

         $delegate.$broadcast = function() { 
          $log.debug('broadcast', arguments); 
          return _broadcast.apply(this, arguments); 
         }; 
         $delegate.$on = function() { 
          $log.debug('on', arguments); 
          return _on.apply(this, arguments); 
         }; 
         return $delegate; 
        }); 
       }]); 

평소 $ rootScope $ 방송, $의 범위로 자신의 코드에

과 :..

답변

1
대신 서비스의

, 더 나은 뭔가 같은 장식을 사용하는 앱의 모든 기능을 사용할 수 있으며 ui-router 및 기타 라이브러리와 같은 제 3 자 이벤트도 볼 수 있습니다.

1

저는 지난 주에 어려움을 겪고 좋은 해결책을 찾았습니다. 이 blog post을 기반으로하는 아이디어는 애플리케이션에서 이벤트 처리를 중앙 집중화 (예 : 리스너 제거 및 모든 이벤트 이름 노출)하기 위해 서비스를 만드는 것입니다. 또한 이벤트를 게시하거나 구독 할 때 오타가 발생하지 않도록 경고하기 위해 이벤트 이름을 확인합니다.

(function() { 
'use strict'; 

angular 
    .module('app') 
    .factory('eventService', eventService) 

eventService.$inject = ['$rootScope', '$log']; 


function eventService($rootScope, $log) { 

    return { 
     subscribe: subscribe, 
     publish: publish, 
     LOGIN: 'login', 
     LOGOUT: 'logout' 
    } 

    function subscribe(scope, event, callback) { 
     safeCheck(this, event); 
     var handler = $rootScope.$on(event, callback); 
     scope.$on('$destroy', handler); 
     return handler; 
    } 

    function publish(event, data) { 
     safeCheck(this, event); 
     $rootScope.$emit(event, data); 
    } 

    function safeCheck(serviceObject, event) { 
     var safe = false; 
     angular.forEach(serviceObject, function(value, key) { 
      if(event == value) { 
       safe = true; 
      } 
     }); 
     if(!safe) { 
      $log.warn("Event " + event + " not found in service"); 
     } 
    } 

} 


})(); 

그럼 당신은 $scope 당신의 on에 전달,

eventService.publish(eventService.LOGIN, userObject); 

eventService.subscribe($scope, eventService.LOGIN, function(event, userObject) { 

      $log.info("User logged in", userObject); 

     }); 

직접 대답하기 위해, 예를 구독하거나 이벤트에 데이터를 게시하는 서비스를 당신의 문제에 대한 해결책이 될 수 호출 할 수 있습니다 방법.

관련 문제