AngularJs广播事件

时间:2014-06-07 05:46:18

标签: javascript angularjs

我想从javascript函数广播角度事件,即angular.injector(['ng','myModule'])。get(“mySharedService”)。prepForBroadcast('hello'); 通过使用上面的行,我可以调用prepForBroadcast(),但是我无法在$ scope中捕获事件。$ on()

注意:我想从javascript函数调用prepForBroadcast()方法。

    <!-- index.html -->
<!DOCTYPE html>
<html>
<head>
  <!-- SPELLS -->
  <!-- load angular via CDN -->
  <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.8/angular.min.js"></script>
  <script src="script.js"></script>
  <style>
    .question{
        border:1px solid darkgray;
        padding:10px;
        margin-bottom:10px;
    }
  </style>
</head>
<body>
    <div ng-app="myModule">
        <div id="appID" ng-controller="ControllerZero">
            <input ng-model="message" >
        </div>

        <div ng-controller="ControllerOne">
            <input ng-model="message" >
        </div>

        <div ng-controller="ControllerTwo">
            <input ng-model="message" >
        </div>

        <my-component ng-model="message"></my-component>
    </div>

</body>
<script>
angular.injector(['ng','myModule']).get("mySharedService").prepForBroadcast('hello');
</script>
</html>

script.js文件

var myModule = angular.module('myModule', []);
myModule.factory('mySharedService', function($rootScope) {
    var sharedService = {};

    sharedService.message = '';

    sharedService.prepForBroadcast = function(msg) {
        console.log('prepForBroadcast');
        this.message = msg;
        this.broadcastItem();
    };

    sharedService.broadcastItem = function() {
        console.log('broadcastItem');
        $rootScope.$broadcast('handleBroadcast');
    };

    return sharedService;
});

myModule.directive('myComponent', function(mySharedService) {
    return {
        restrict: 'E',
        controller: function($scope, $attrs, mySharedService) {
            $scope.$on('handleBroadcast', function() {
                $scope.message = 'Directive: ' + mySharedService.message;
            });
        },
        replace: true,
        template: '<input>'
    };
});

function ControllerZero($scope, sharedService) {
    $scope.$on('handleBroadcast', function() {
        console.log('handle event');
        $scope.message = sharedService.message;
    });
}

function ControllerOne($scope, sharedService) {
    $scope.$on('handleBroadcast', function() {
        $scope.message = 'ONE: ' + sharedService.message;
    });
}

function ControllerTwo($scope, sharedService) {
    $scope.$on('handleBroadcast', function() {
        $scope.message = 'TWO: ' + sharedService.message;
    });
}



ControllerZero.$inject = ['$scope', 'mySharedService'];

ControllerOne.$inject = ['$scope', 'mySharedService'];

ControllerTwo.$inject = ['$scope', 'mySharedService'];

2 个答案:

答案 0 :(得分:1)

angular.injector()创建一个新的注入器,并使用新的$rootScope。该活动将在这个新的$rootScope上播出,而不是在您的控制器正在收听的节目上播出。

您需要检索已与您的应用程序关联的进样器:

angular.element(domElement).injector();

您还需要手动触发摘要循环以便更新数据绑定,例如使用$apply

示例:

angular.element(document).ready(function() {

  var element = angular.element(document.querySelector('.ng-scope'));
  var injector = element.injector();
  var scope = element.scope();

  scope.$apply(function() {
    injector.get('mySharedService').prepForBroadcast('hello');
  });
});

演示: http://plnkr.co/edit/NDKBdzSmvN1xY7alafir?p=preview

答案 1 :(得分:0)

从一个控制器发布事件并在其他控制器中监听它们的另一种方法是使用angular-PubSub模块。

PubSub只允许订阅者监听已发布的事件,而不像$rootScope.$broadcast,它将事件发送到Scope层次结构中的所有Scopes,这使得它与PubSub方法相比效率低下。