角事件改变数据发射

问题描述:

什么是做以下情形的最佳方式:角事件改变数据发射

在一个部件我有建立这样一个数组的函数:

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

在父控制器,I希望能够根据需要更改此数组。我认为我可以使用以下事件:在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' – harishr

+0

这会改变原来的变量吗? – Filip

+0

相同的结果.. – Filip

我会使用一项服务。

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的。

+0

而我将如何修改列变量? – Filip

+0

我已经用一个非常简单的例子更新了答案。 'arr'将会在两者之间共享,但是您仍然需要跟踪两者中的更改,这就是为什么我建议观察者模式的原因。 –

我结束了创建一个服务:

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

然后,在我的两个控制器我注入$通用。在我的指令控制器中,我进入了我的主要列,之后,我在$ rootScope $rootScope.$broadcast('$genericColumns')上播出了一个事件。在此之后,我可以听父控制器上的$genericColumns事件,并在那里修改$ generic.Columns数组(添加额外的列),并且这些更改也反映在指令控制器上。工作正常。