Как обновить другой угловой контроллер в режиме реального времени, используя контроллер как синтаксис
В настоящее время я пытаюсь получить значение счетчика строк из веб-API с помощью службы одного контроллера, а затем обновить переменную другого контроллера после того, как значение было получено из БД, и все это при этом избегая использования $scope или $rootScope.
Ниже Controller1 - этот контроллер должен обновлять свою переменную при изменении значения в сервисе. В настоящее время он работает правильно, но я бы хотел избежать использования $scope или $rootScope:
(function() {
'use strict';
angular
.module('app.event')
.controller('Controller1', Controller1);
Controller1.$inject = ['service1', '$stateParams', '$rootScope'];
/**
* Controller 1
* @constructor
*/
function Controller1(service1, $stateParams, $rootScope) {
// Declare self and variables
var vm = this;
vm.number = 0;
init();
$rootScope.$on('countChanged', refresh);
/**
* Initializes the controller
*/
function init() {
service1.refreshCount($stateParams.id);
}
/**
* Refreshes the count
* @param {object} event - The event returned from the broadcast
* @param {int} count - The new count to update to
*/
function refresh(event, count) {
vm.number = count;
}
}
})();
Служба - я бы хотел избежать использования трансляции $rootScope.$ Здесь:
(function() {
'use strict';
angular
.module('app.event')
.factory('service1', service1);
service1.$inject = ['APP_URLS', '$http', '$rootScope'];
/**
* The service
* @constructor
*/
function service1(APP_URLS, $http, $rootScope) {
// Declare
var count = 0;
// Create the service object with functions in it
var service = {
getCount: getCount,
setCount: setCount,
refreshCount: refreshCount
};
return service;
///////////////
// Functions //
///////////////
/**
* Re-calls the web API and updates the count
* @param {Guid} id - The ID needed for the API call parameter
*/
function refreshCount(id) {
$http({ url: APP_URLS.api + '<TheAPINameHere>/' + id, method: 'GET' }).then(function (response) {
setCount(response.data.Count);
changed();
});
}
/**
* Returns the count value
*/
function getCount() {
return count;
}
/**
* Re-calls the web API and updates the count
* @param {int} newCount - The new count value
*/
function setCount(newCount) {
count = newCount;
changed();
}
/**
* Broadcasts a change event to be picked up on in Controller1
*/
function changed() {
$rootScope.$broadcast('countChanged', count);
}
}
})();
Ниже приведена функция в Controller2, которая обновляет значение в службе - я хотел бы иметь возможность получить значение в Controller1 для обновления, как только я сделаю это:
/**
* Removes a row from the database
* @param {object} field - The data row object that we're deleting from the table
*/
function remove(field) {
// Delete the row from the database
service2.delete(field.Id);
// Remove the row from the local data array and refresh the grid
vm.data.splice(vm.data.indexOf(field), 1);
// Set the count in the service to update elsewhere
service1.setCount(vm.data.length);
vm.indices.reload();
}
1 ответ
Я избегал использования $rootScope для практических целей, однако, похоже, это лучший путь. Публичное свойство не работало для меня, когда я пытался использовать его в соответствии с некоторыми другими предложениями, поэтому я использовал $rootScope.$ Emit, как предложил CainBot.