服务和控制器之间的魔力连接(角度)

时间:2015-03-08 19:47:24

标签: angularjs service controller

如果我有两个控制器和一个在控制器之间通信的服务,一个控制器的范围如何影响服务中的值?对我来说,它看起来像设置控制器值与服务的值,这就是它,但不知何故控制器可以更改服务值而无需调用任何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>

我创建了一个小提琴,用于显示示例中的行为。

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

1 个答案:

答案 0 :(得分:0)

这是有效的,因为JavaScript使用对象的引用传递。

由于_items引用了一个对象,因此对它的引用也引用同一个对象。因此,当您的服务返回{ items: _items }时,它将返回对_items引用的对象的引用。然后控制器将其范围变量设置为引用同一对象。之后,更改范围变量上的属性值 - 如items.magic是对所引用的基础对象_items的更改。

这样做很好,但确实显示_items并非真正私有,因此下划线会产生误导。