что лучший способ сделать следующий сценарий:
В компоненте у меня есть функция, которая строит массив следующим образом:
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
.
Каков наилучший способ сделать это? Как я могу изменить переменную в области дочерней директивы, когда это необходимо?
Я закончил создание сервиса:
angular.module('common.directives.lists', [])
.factory('$generic', function() {
return {Columns: []};
})
Затем в обоих моих контроллерах я вводил $ generic. В моем директивном контроллере я вошел в мои основные столбцы, и после этого я транслировал событие на $ rootScope $rootScope.$broadcast('$genericColumns')
. После этого я мог бы прослушивать событие $genericColumns
на родительском контроллере, и там я бы изменил массив $ generic.Columns (добавьте дополнительные столбцы), и изменения отразятся и на директивном контроллере. Работает нормально.
Я бы воспользовался услугой.
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
.
arr
и будут разделены между двумя, но вам все равно может понадобиться отслеживать изменения, сделанные в обоих случаях, поэтому я предлагаю схему наблюдателя для этого.
$scope
а не на$rootscope
, используйте$scope.$on