0

我无意中污染了一个服务,但我认为我只是将其分配给一个范围。例如:AngularJS - 外部污染提供商,服务和工厂

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在上面的例子中testCtrl.testService = angular.copy(testService);

我猜这肯定是有意的行为。如果是这样,除了性能优势,我认为这是一个缺点。

为什么AngularJS允许这种行为,而不是“黑匣子”提供者?

+0

这是JavaScript原型继承的工作原理;功能是对象。顺便提一下,提供者是单身人士,使用'angular.copy'来“克隆”提供者可能会产生意想不到的副作用。 – Claies

+0

让用户不要误解JS如何工作,这不是框架的责任。顺便说一句,你期望什么样的答案? – estus

+0

@estus我只是想,如果你打算打电话给一个服务,它应该像一个服务。如果我为您提供一箱牛奶送到您的房子,然后您拿起箱子并取出几瓶酒,我不会期望从我的货车的每个箱子中取出2个瓶子,或者您可以更换任何东西在我的面包车到酸奶箱。我期望的答案是可能突出显示我自己看不到的好处的答案。 – dewd

回答

0

从该问题的评论中的讨论得出结论,似乎AngularJS没有具体的理由允许这种行为,除了服务没有被封装只有一个API来访问它们。因此,适用JavaScript的正常规则,即传递给函数的服务,例如, directive,controller通过引用传递给服务对象,并且对该引用的任何更改都直接在源上更新该对象。由于服务是单身人士,所以更改会反映在使用服务的应用程序中。

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