Данные об изменении угловых событий

0

что лучший способ сделать следующий сценарий:

В компоненте у меня есть функция, которая строит массив следующим образом:

var arr = ['a','b'];

В родительском контроллере я хочу иметь возможность изменить этот массив, если это необходимо. Я думал, что для этого могу использовать события: в PHP (используя Laravel) я могу вызвать по ссылке переменную при прослушивании этого события и тем самым, когда я изменяю переменную внутри блока listen, исходная переменная обновляется.

В угловой, я попытался $emit событие на rootScope и слушать на этом событии на родительском контроллере:

// directive controller
$rootScope.$emit('$genericColumns', arr)

// parent controller
$rootScope.$on('$genericColumns', function($event, arr) {
        arr = [];
        return arr;
    });

Но делая это, не меняет исходную переменную arr.

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

  • 0
    слушайте его на $scope а не на $rootscope , используйте $scope.$on
  • 0
    это изменит исходную переменную?
Показать ещё 1 комментарий

2 ответа

0

Я закончил создание сервиса:

angular.module('common.directives.lists', [])
                .factory('$generic', function() {
                    return {Columns: []};
                })

Затем в обоих моих контроллерах я вводил $ generic. В моем директивном контроллере я вошел в мои основные столбцы, и после этого я транслировал событие на $ rootScope $rootScope.$broadcast('$genericColumns'). После этого я мог бы прослушивать событие $genericColumns на родительском контроллере, и там я бы изменил массив $ generic.Columns (добавьте дополнительные столбцы), и изменения отразятся и на директивном контроллере. Работает нормально.

0

Я бы воспользовался услугой.

angular.module('app').factory('genericColumns', function(){
  var columns = {};

  columns.arr = [];   

  return columns;
});

Очевидно, что вам нужно будет правильно ссылаться в своем приложении, я только что использовал app здесь.

Затем введите его в контроллер (ы), и они будут делиться данными.

angular.module('app').controller('ColumnCtrl', function (genericColumns){
  $scope.columns = genericColumns.arr;
});

Вы все равно можете использовать $ emit и $ on для каждого контроллера, о котором известно, когда были сделаны изменения, хотя я бы предложил использовать шаблон наблюдателя для этого вместо использования $rootScope.

  • 0
    И как именно я изменил бы переменную столбцов?
  • 0
    Я обновил ответ очень простым примером для вас. arr и будут разделены между двумя, но вам все равно может понадобиться отслеживать изменения, сделанные в обоих случаях, поэтому я предлагаю схему наблюдателя для этого.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню