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行爲。