我无意中用我认为我只分配给范围的属性污染了服务。例子:
var ServiceFunction = function ServiceFunction(){
this.greeting = 'Hello';
};
var TestController = function TestController(testService){
var testCtrl = this;
testCtrl.testService = testService;
//here I make changes within the controller. This amends the service itself
testCtrl.testService.newProperty = 'new value';
};
angular.module('test',[])
.service('testService',ServiceFunction)
.controller(['testService',TestController])
这是一个 Plunker 来演示这种行为:
https://plnkr.co/edit/nDkNfKmQRtcBuJ0NUcHo?p=preview
我知道在将对象传递给函数时,JavaScript 是通过引用传递的。除非这些对象被深度克隆。
我曾假设服务之外的某些东西可以访问该服务公开的对象等,但只能通过值访问,并且对该服务的任何更改都必须由该服务提供的 api 完成。似乎唯一的方法是angular.copy
在上面的例子中使用 egtestCtrl.testService = angular.copy(testService);
我猜这一定是预期的行为。如果是这样,除了性能优势之外,我认为这是一个缺点。
为什么 AngularJS 允许这种行为而不是“黑盒”提供者?