2015-03-08 78 views
1

如果我有兩個控制器和一個在控制器之間通信的服務,一個控制器的作用域如何影響服務中的值?對我來說,它看起來像設置控制器的價值與服務的價值,這就是它,但不知何故控制器可以更改服務值,而無需調用任何設置方法?這是一種處理服務的好方法嗎? 我搜索了它,但找不到一個好的答案。文檔和博客帖子的答案和例子,歡迎,謝謝。服務和控制器之間的魔術連接(角度)

// App.js  
angular.module("myApp",[]); 
angular.module("myApp").service("shareSvc", function(){ 
    var _items = {}; 

    return { 
     items: _items 
    } 
}); 
angular.module("myApp").controller("controller1", function($scope,  shareSvc){ 
    $scope.items = shareSvc.items; 
    $scope.items.magic = "magic"; 
}); 
angular.module("myApp").controller("controller2", function($scope,  shareSvc){ 
    $scope.items = shareSvc.items; 
}); 

//HTML 
<body ng-app="myApp"> 
    <div ng-controller="controller1"> 
     <div>{{items.magic}}</div> 
    </div> 

    <div ng-controller="controller2"> 
     <div>{{items.magic}}</div> 
    </div> 
</body> 

我創建了一個小提琴,它演示了一個例子中的行爲。

https://jsfiddle.net/w0pq3cp8/1/

+0

您等價地調用shareSvc.items.magic =「magic」; – penner 2015-03-08 20:42:50

回答

0

這工作,因爲JavaScript通過對象參考使用通行證。

由於_items引用了一個對象,對它的引用也指向同一個對象。因此,當您的服務返回{ items: _items }時,它將返回對_items引用的對象的引用。然後控制器將其範圍變量設置爲引用同一個對象。之後,改變範圍變量的屬性值 - 如items.magic是對該基礎對象_items的引用。

這很好,但它確實表明_items不是真正的私人,所以下劃線是誤導。

+0

謝謝你真的幫了我 – Frank 2015-03-16 20:23:34

相關問題