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.
The $rootScope. $broadcast is used to broadcast a “global” event that can be caught by any listener of that particular scope. The descendant scopes can catch and handle this event by using $scope.
The main difference is the availability of the property assigned with the object. A property assigned with $scope cannot be used outside the controller in which it is defined whereas a property assigned with $rootScope can be used anywhere.
An app can have only one $rootScope which will be shared among all the components of an app.
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);
});
}
};
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;
})
};
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With