如果我有两个控制器和一个在控制器之间通信的服务,一个控制器的范围如何影响服务中的值?对我来说,它看起来像设置控制器值与服务的值,这就是它,但不知何故控制器可以更改服务值而无需调用任何setter方法?处理服务是一种优秀且高效的方式吗? 我搜索它但找不到一个好的答案。欢迎提供文档和博客文章的答案和示例,谢谢。
// 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>
我创建了一个小提琴,用于显示示例中的行为。
答案 0 :(得分:0)
这是有效的,因为JavaScript使用对象的引用传递。
由于_items
引用了一个对象,因此对它的引用也引用同一个对象。因此,当您的服务返回{ items: _items }
时,它将返回对_items
引用的对象的引用。然后控制器将其范围变量设置为引用同一对象。之后,更改范围变量上的属性值 - 如items.magic
是对所引用的基础对象_items
的更改。
这样做很好,但确实显示_items
并非真正私有,因此下划线会产生误导。