Как обновить другой угловой контроллер в режиме реального времени, используя контроллер как синтаксис

В настоящее время я пытаюсь получить значение счетчика строк из веб-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.

Другие вопросы по тегам