$rootScope.$broadcast not working

12,700

Solution 1

When you use $broadcast or $emit. You should have $scope.$on to listen to that event.

$scope.$on('dataPassed', function(){ //code go here });

Edit: Update working code for question requirement

var app = angular.module("productsApp", [])
    .service("serviceProvider", function ($http) {
        this.getDatas = function getDatas(data) {
            return $http({
                method: 'POST', url: serviceUrl + '/GetProductsByCategoryOrName', headers: {
                    'Authorization': apiKey
                },
                data: data
            });
        }
        return this
    }).factory("sharedService", ['$rootScope', function ($rootScope) {
        var mySharedService = {
            values: [],
            setValues: function(data){
                if(data){
                    mySharedService.values.length = 0;
                    data.forEach(function(item){
                        mySharedService.values.push(item);
                    });    
                }
            }
        };
        return mySharedService;
    }]);      
function GetController($scope, serviceProvider, sharedService, $rootScope) {
    var shareData = sharedService;
    $scope.products = sharedService.values;
    $scope.shareData = sharedService;
    var data = { "query": "grocery", "categoryId": "976759", "pageIndex": 0, "sortDirection": "asc" };
    serviceProvider.getDatas(data).then(function (response) {
        sharedService.setValues(response.data.data);
    });
}
function searchProductsController($scope, $window, serviceProvider, sharedService, $rootScope) {
    $scope.submit = function () {
        var data = { "query": $scope.searchText, "categoryId": "976759", "pageIndex": 0, "sortDirection": "asc" };
        serviceProvider.getDatas(data).then(function (response) {
            sharedService.setValues(response.data.data);
        });
    }
};

Solution 2

You should have put a listeners to listen to the broadbasted event. Broadcasted event would not directly update your view data directly on view html. You have to use $on over scope to bind events on scope. Inside a callback function of it. You would get an benefit to get broadcasted data & re assign that retrieve data to scope variable again to get updated binding.

Code

var app = angular.module("productsApp", [])
  .service("serviceProvider", function($http) {
  this.getDatas = function getDatas(data) {
    return $http({
      method: 'POST',
      url: serviceUrl + '/GetProductsByCategoryOrName',
      headers: {
        'Authorization': apiKey
      },
      data: data
    })
  }
  return this;
}).factory("sharedService", ['$rootScope', function($rootScope) {

  var mySharedService = {};

  mySharedService.values = [];

  mySharedService.passData = function(newData) {
    mySharedService.values = newData;
    $rootScope.$broadcast('dataPassed', newData)
  }

  return mySharedService;
}]);

function GetController($scope, serviceProvider, sharedService, $rootScope) {
  var data = {
    "query": "grocery",
    "categoryId": "976759",
    "pageIndex": 0,
    "sortDirection": "asc"
  };
  serviceProvider.getDatas(data).then(function(response) {
    sharedService.passData(response.data.data);
  });
  //listener should register when controller loads
  $scope.$on('dataPassed', function(event, newData) {
    sharedService.values = newData;
    $scope.products = sharedService.values;
  })
}

function searchProductsController($scope, $window, serviceProvider, sharedService, $rootScope) {
    $scope.submit = function() {
      var data = {
        "query": $scope.searchText,
        "categoryId": "976759",
        "pageIndex": 0,
        "sortDirection": "asc"
      };
      serviceProvider.getDatas(data).then(function(response) {
        var result = response;
        sharedService.passData(result.data.data);
      });
    }
    //listener should register when controller loads
    $scope.$on('dataPassed', function(event, newData) {
      console.log(newData);
      sharedService.values = newData;
    })
};

Solution 3

You should listen what you are broadcasting :

$rootScope.$on('dataPassed', function(data){
console.log(data);
});

This reference may help : Why do we use $rootScope.$broadcast in AngularJS?

Share:
12,700
Manoz
Author by

Manoz

Web developer C#, .NET MVC, CORE Certified EPIServer Developer. Areas expertise with - C#, MVC, React, Node, Webpack, .NET Core, Web API, EPIServer CMS/CM

Updated on June 05, 2022

Comments

  • Manoz
    Manoz about 2 years

    I am trying to get $rootScope.$broadcast to refresh my view. The service is-

    var app = angular.module("productsApp", [])
        .service("serviceProvider", function ($http) {
            this.getDatas = function getDatas(data) {
                return $http({
                    method: 'POST', url: serviceUrl + '/GetProductsByCategoryOrName', headers: {
                        'Authorization': apiKey
                    },
                    data: data
                })
            }
            return this
        }).factory("sharedService", function ($rootScope) {
    
            var mySharedService = {};
    
            mySharedService.values = [];
    
            mySharedService.passData = function (newData) {
                mySharedService.values = newData;
                $rootScope.$broadcast('dataPassed', newData);
            }
    
            return mySharedService;
        });
    

    Invoking through controller-

    function searchProductsController($scope, $window, serviceProvider, sharedService) {
        $scope.submit = function () {
            var data = { "query": $scope.searchText, "categoryId": "976759", "pageIndex": 0, "sortDirection": "asc" };
            serviceProvider.getDatas(data).then(function (response) {
                var result = response;
                sharedService.passData(result.data.data);
            });
        }
    };
    

    here in this controller sharedService.passData which passes new array to service method. Then it is trying to broadcast it for the changes with the line- $rootScope.$broadcast('dataPassed', newData)

    I don't know why it is not broadcasting the changes to view. Is there any other way to broadcast the changes?

    Note- My earlier question How to transfer data between controllers couldn't get me any help.

    Edit

    So far I've changed in the listeners-

    mySharedService.passData = function (newData) {
        $rootScope.$broadcast('dataPassed', newData)
    }
    $rootScope.$on('dataPassed', function (newData) {
        mySharedService.values = newData;
    })
    

    But still can't get refreshed view.

  • Manoz
    Manoz over 8 years
    How do I access $scope in service?
  • Pankaj Parkar
    Pankaj Parkar over 8 years
    No you shouldn't.. Above code you should put inside a controller
  • Manoz
    Manoz over 8 years
    Can you please view my js on stackoverflow group chat please? I am still not getting this work