2016-08-18 86 views
0

什麼是做以下情形的最佳方式:角事件改變數據發射

在一個部件我有建立這樣一個數組的函數:

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

回答

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

+0

而我將如何修改列變量? – Filip

+0

我已經用一個非常簡單的例子更新了答案。 'arr'將會在兩者之間共享,但是您仍然需要跟蹤兩者中的更改,這就是爲什麼我建議觀察者模式的原因。 –

0

我結束了創建一個服務:

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

然後,在我的兩個控制器我注入$通用。在我的指令控制器中,我進入了我的主要列,之後,我在$ rootScope $rootScope.$broadcast('$genericColumns')上播出了一個事件。在此之後,我可以聽父控制器上的$genericColumns事件,並在那裏修改$ generic.Columns數組(添加額外的列),並且這些更改也反映在指令控制器上。工作正常。