Автоматически обновлять переменную id в двух контроллерах, используя $broadcast в AngularJS

$ctrl.clicker = function(id)
{
   $rootScope.$broadcast('idBull', id);
}

Когда я вводю изображение мышью, вызывается указанная выше функция. Я хочу поделиться идентификатором в другом контроллере и передать все изменения, которые были внесены в этот идентификатор.

$scope.$on('idBull', function (event, data) {
  console.log(data); // 'Data to send'
});

В другом контроллере я использовал код для создания консольного лога моего идентификатора, но не получил результатов.

2 ответа

Не уверен, почему ваш код не работает, возможно, контроллер с $scope.$on не создается / загружается, когда $rootScope.$broadcast выполняется?

Другое решение состоит в том, чтобы использовать сервис, который вы вводите в оба контроллера, и вместо этого использовать его для связи. Пример широковещательного решения:

var app = angular.module("app", [])
.controller("ControllerA", function($scope, $rootScope)
{
    $scope.clicker = function(id)
    {
        $rootScope.$broadcast("id changed", id);
    }
})
.controller("ControllerB", function($scope)
{
    $scope.$on("id changed", function(event, id)
    {
        // Do whatever you need to do with id
    });
});

Пример решения с индивидуальным сервисом:

var app = angular.module("app", [])
.factory("customService", function()
{
    var callbacks = [];

    return {
        onIdChange: function(callback)
        {
            callbacks.push(callback);
        },
        idChanged: function(id)
        {
            callbacks.forEach(function(callback)
            {
                callback(id);
            });
        }
    };
})
.controller("ControllerA", function($scope, customService)
{
    $scope.clicker = function(id)
    {
        customService.idChanged(id);
    }
})
.controller("ControllerB", function(customService)
{
    customService.onIdChange(function(id)
    {
        // Do whatever you need to do with id
    });
});

http://jsfiddle.net/87rLob9x/ Проверьте эту скрипку, надеюсь, это поможет HTML

<html ng-app="myApp">
<div ng-controller='ControllerA'>

    <button ng-click='add()'>Add</button
</div>
<div ng-controller='ControllerB'>
    {{ increment }}

</div>

</html>

ЯШ:

var app = angular.module('myApp', [])
.controller('ControllerA', function($scope) {
    $scope.increment = 0;
    $scope.add = function() {
        $scope.$broadcast('hasIncremented');
    }

}).
controller('ControllerB', function($scope) {
    $scope.$on('hasIncremented', function(event) {
        $scope.increment++; 
    });
})
Другие вопросы по тегам