2013-05-06 79 views
2

小提琴:http://jsfiddle.net/6RBJ5/1/更改對象angularjs

所以基本上我要訪問從在子作用域修改父範圍的對象。

function Parent($scope) { 
    $scope.data = null; 
} 

function Child($scope) { 
    $scope.data = [{id:1}, {id:2}] 
} 

HTML:

<div ng-controller="Parent"> 
    Data length: {{ data.length }}<br> 
<div ng-controller="Child"></div> 
</div> 

但是長度打印什麼。任何想法如何解決這一問題?

回答

3

One way

$scope.$parent.data = [{id:1}, {id:2}] 

儘管這感覺不對。

Another would be to create the empty array in the parent, and just modify it instead of replacing it in the child.

或者,也許你真正需要的是use a service;這取決於你真正想要完成的事情。

定義服務:

var myApp = angular.module('myApp', []); 
myApp.factory('tickets', function factory() { 

    var tickets = []; 

    function add(ticket){ 
     tickets.push(ticket); 
    } 
    function count(){ 
     return tickets.length; 
    } 

    return { 
     add: add, 
     count: count 
    }; 

}); 

使用服務:

function Parent($scope, tickets) { 
    $scope.tickets = tickets; 
} 

function Child($scope, tickets) { 

    tickets.add({id:1}); 
    tickets.add({id:2}); 

} 

HTML:

<div ng-controller="Parent"> 
    Data length: {{ tickets.count() }}<br> 
    <div ng-controller="Child">  
    </div> 
</div> 

注意如何清潔和業務modelly的控制器,並且您可以將票據概念在一個地方乾淨地擴展,並通過將其注入到控制器中而從任何地方訪問它。你可以做到這一點,而不用擔心控制器之間的等級或關係或污染你的環境。另一方面,如果你的應用程序非常簡單,它可能會過度殺傷。

+0

我想簡單地顯示父範圍內的票證長度。就這樣。你會建議什麼解決方案? – 2013-05-06 08:40:15

+0

通常,在其他不相關的控制器之間進行通信的正確方式是通過服務,所以我認爲「正確的」解決方案是使用服務。這將保持你的控制器分離和清潔。缺點是它需要更多的代碼。我會添加一個例子。 – Supr 2013-05-06 09:00:46