发出角度事件变化​​数据

时间:2016-08-18 10:23:58

标签: javascript php angularjs

执行以下方案的最佳方法是什么:

在一个组件中,我有一个像这样构建数组的函数:

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

在父控制器中,我希望能够在需要时更改此数组。我认为我可以使用事件:在PHP中(使用Laravel)我可以在监听该事件时通过引用调用一个变量,并通过这样做,当我修改listen块内的变量时,原始变量得到更新。

在angular中,我在rootScope上尝试$emit一个事件并在父控制器上侦听该事件:

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

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

但是这样做不会修改原始的arr变量。

实现这一目标的最佳方法是什么?如何在需要时修改子指令范围中的变量?

2 个答案:

答案 0 :(得分: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;
});

尽管我建议使用observer pattern代替使用$rootScope,但您仍然可以使用$ emit和$ on来了解每个控制器何时进行了更改。

答案 1 :(得分:0)

我最终创建了一项服务:

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

然后,在我的两个控制器中,我注入了$ generic。在我的指令控制器中,我进入了我的主列,之后,我在$ rootScope $rootScope.$broadcast('$genericColumns')上播放了一个事件。在此之后,我可以在父控制器上监听$genericColumns事件,然后我会修改$ generic.Columns数组(添加其他列),更改也会反映在指令控制器上。工作正常。