2012-09-07 102 views
4

我試圖從angularjs應用程序中的子控制器內的父控制器中移動位,以免太多污染主控制器。 這裏有一個簡化小提琴:http://jsfiddle.net/terebentina/5RMPV/ 所以當我點擊更改按鈕時,第三個字母應該變成'X'。 最初item_change()函數是在主控制器內部,並且正在做$scope.items[idx] = 'X',這工作得很好。但是,由於我將它移動到ItemCtrl中,所以我不知道如何訪問第三個元素。angularjs:從外部範圍訪問內部示波器

任何幫助將不勝感激。

+0

對於簡單的數據建模,模型數據與單個控制器(可以通過$範圍)相關,與行爲/該模型的方法是該單個控制器上的功能。當你需要更復雜的東西時 - 例如多個控制器需要訪問相同的數據/模型 - 你可以使用$ scope。$ emit events和$ scope。$來監聽事件,或者(更好的方法) Gloopy顯示:將模型的數據(和行爲/功能)放入一個服務中,然後通過注入使控制器訪問。 –

+0

我最初是想讓項目真正的js對象都有item_change()方法,所以我可以調用$ scope.items [3] .item_change(),但它可能是矯枉過正。我現在要和Gloopy的建議一起去。謝謝 –

回答

6

將事情從主控制器中移出的一種方法是共享並更改服務器或工廠內的控制器之間的數據(在this article中描述得非常好)。

這是updated fiddle。你只需要在itemsService注入到任何控制器,你將要訪問的項目數據。

angular.module('test', []) 
    .service('itemsService', function(){ 
     var items = ['A', 'B', 'C', 'D']; 

     return{ 
      getItems: function(){ 
       return items; 
      }, 
      changeItem: function(index, value){ 
       items[index] = value; 
      } 
     } 
    }) 
    .controller('MainCtrl', function($scope, itemsService) { 
     $scope.items = itemsService.getItems();  

     $scope.change = function(idx) { 
      itemsService.changeItem(idx, 'X'); 
     } 

    }) 
+0

哦......有道理。仍圍繞着「有角度的方式」。謝謝 –