スコープにのみ割り当てていると思っていたプロパティで、意図せずサービスを汚染してしまいました。例:
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 が「ブラックボックス」プロバイダーではなく、この動作を許可するのはなぜですか?