0

我无意中用我认为我只分配给范围的属性污染了服务。例子:

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 允许这种行为而不是“黑盒”提供者?

4

1 回答 1

0

从问题下评论中的讨论得出结论,AngularJS似乎没有具体的理由允许这种行为,除了服务没有被封装只有一个api来访问它们。

因此,JavaScript 的正常规则适用,即传递给函数的服务,例如directivecontroller通过引用传递给服务对象,并且对该引用的任何更改直接在源处更新对象。由于服务是单例的,因此更改会反映在使用服务的整个应用程序中。

这种方法有性能优势,因为它是自然的 JavaScript 行为。

于 2016-06-08T09:34:57.757 回答