2015-03-08 57 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