2017-10-04 7 views
0

これまでに行ったことがありますが、今回は何が問題になったのか分かりません。角1:コントローラ経由で更新されたサービス変数

サービス:

angular.module('module') 
    .service("BaseService", function() { 
    var vm = this; 
    var testValue = {a:1,b:2}; 
    vm.getTestValue = function(){ 
     return testValue; 
    } 
    }); 

コントローラーでの方法:

vm.getTest = function(){ 
     console.log(BaseService.testValue) // undefined - cool 
     console.log(BaseService.getTestValue()) //{a: 1, b: 2} - cool 
     var value = BaseService.getTestValue(); 
     console.log(value) // {a: 1, b: 2} - cool 
     value.a = 20; // updated local object 
     console.log(value) // {a: 20, b: 2} -cool 
     console.log(BaseService.getTestValue())-- {a: 20, b: 2} -- ??? why 
} 

は、ローカル変数は、サービス内で、それはそのように振る舞う場合は更新なっている理由私の質問は、明らかであるホープ..サービス/工場で機能を設定する正しい方法は何でしょうか?VMで機能を追加するのではなく、機能のプロトタイプを作成する方がよいでしょう。

答えて

0

サービス内の変数(testValue)は、reference typeに属するオブジェクトです。コントローラで使用すると、参照のみが取得され、オブジェクトは同じままです。実際には同じオブジェクトへの参照が2つあるため、参照の1つを使用してそのプロパティを変更すると、オブジェクトに影響します。変更されたオブジェクトを取得します。

2つのドアがある部屋を想像してください。ここでは扉が参考になり、部屋は物体そのものです。あなたが1つのドアを通って来て、部屋の中の何かを変えたら、もう1つの部屋から入ると、あなたは部屋の変化を見ることができます。

現在のオブジェクトを取得したくない場合は、関数内のオブジェクトcopyをコピーして返します。

vm.getTestValue = function() { 
    return angular.copy(testValue); 
} 
+0

ありがとうございました...私は代わりとしてやっています...しかし、これらのオブジェクトに対処する最善の方法を知りたいです...そして部屋の例のおかげで...非常に革新的で覚えやすい。 – Luckyy

+0

オブジェクトを変更する必要がない場合は、その関数を不変にする必要があるため、コピーを返す必要があります。 –

関連する問題