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、上記の例で例を使用することですtestCtrl.testService = angular.copy(testService);

これは意図した動作に違いないと思います。もしそうなら、パフォーマンス上の利点を除いて、これは欠点だと思います。

AngularJS が「ブラックボックス」プロバイダーではなく、この動作を許可するのはなぜですか?

4

1 に答える 1

0

質問の下のコメントでの議論から結論を下すと、AngularJS がサービスにアクセスするための API だけでカプセル化されていないこと以外に、AngularJS がこの動作を許可する特定の理由はないようです。

そのため、JavaScript の通常のルールが適用されます。つまり、関数に渡されるサービスはdirectivecontroller参照によってサービス オブジェクトに渡され、その参照に対する変更はソースでオブジェクトを直接更新します。サービスはシングルトンであるため、サービスが使用されるアプリ全体に変更が反映されます。

このアプローチは JavaScript の自然な動作であるため、パフォーマンス上の利点があります。

于 2016-06-08T09:34:57.757 に答える