2017-10-04 9 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 개이므로 참조 중 하나를 통해 속성을 변경하면 객체에 영향을줍니다. 그래서 당신은 변경된 객체를 얻습니다.

두 개의 문이있는 방을 상상해보십시오. 여기서 문은 참조 용이고 방은 객체 자체입니다. 하나의 문을 통해 들어와 방 안의 어떤 것을 변경하면 다른 방에서 들어 와서 방의 변화를 볼 수 있습니다.

현재 개체를 가져 오지 않으려면 copy 개체를 함수에 넣고 복사본을 반환 할 수 있습니다.

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

감사합니다. Suren .... 내가 대안으로하고있는 것이지만 ...이 물체들을 다루는 가장 좋은 방법을 알고 싶습니다 ... 그리고 방의 예를 들어 주셔서 감사합니다 ... 매우 혁신적이며 기억하기 쉽습니다. – Luckyy

+0

개체를 변경할 필요가없는 경우 해당 함수를 변경하지 않아야하므로 복사본을 반환해야합니다. –