2013-07-14 1 views
0

일부 애플리케이션 공통 데이터를 저장하는 서비스가 있습니다. 이 서비스는이 데이터를 수정하고 이벤트에 대응할 수도 있습니다. 그러나이 서비스를 사용하는 컨트롤러에 변경 사항을 전파하는 데 문제가 있습니다.서비스중인 데이터의 컨트롤러로의 변경 적용

나는이 question과이 question을 보았지만 그 해결책은 나를 위해 작동하지 않습니다.

내 핵심 문제를 나타내는 plunker을 만들었습니다. object 공통 데이터를 sharedObject에 저장하는 서비스가 있습니다. 그것은 기능을 updateObject, 데이터를 업데이트 할 수 있습니다 (내 실제 애플 리케이션에서 서버에 요청을 보냅니다). 이 서비스는 주 컨트롤러에서 사용됩니다. 그러나 서비스에서 updateObject이 호출되면 컨트롤러에서 데이터가 업데이트되지 않습니다.

왜 그럴까요? 또한 이것이 최선의 관행입니까 아니면 내가 틀린 일을하고 있습니까?

여기에 코드입니다 :

app = angular.module('app', []); 

app.factory('object', ['$timeout', function($timeout){ 
    var sharedObject = {attr1: '', attr2: ''}; 
    var updateObject = function() { 
    $timeout(function(){ 
     sharedObject = {attr1: 'new value', attr2: 'update value'}; 
     console.log('updated'); 
    }, 1000); 
    } 
    updateObject(); 
    return sharedObject; 
}]); 

app.controller('main', [ 
    '$scope', 'object', function($scope, object) { 
    $scope.$watch(function(){return object}, function(obj){ 
     console.log(obj); 
     $scope.object1 = obj; 
     }, true); 
    } 
]); 
+0

가 plunker뿐만 아니라, 여기에 코드를 게시하시기 바랍니다 업데이트 방법 같은 것을 할 필요가 기본적으로

plunkr 업데이트. –

답변

1

문제는 시간 제한 콜백 사용자가 시청하고있는 개체를 업데이트하지 않습니다. 다른 오브젝트로 대체합니다. 따라서 관찰자는 여전히 수정되지 않은 낡은 객체를 봅니다.

sharedObject.attr1 ='new value'; 
sharedObject.attr2 = 'update value'; 

에 의해, this updated plunker 같이 코드를 교체하고 당신은 값이 페이지에 변화가 나타납니다.

+0

감사합니다. 그러나 한 가지 방법으로이를 수행 할 수있는 방법이 있습니까? 예 : 이 객체에 12 개의 속성이 있다면 모든 속성에 대해이 행을 쓰고 싶지 않을 것입니다. – davekr

+1

실제 객체 ('sharedObject')를 12 개의 필드로 묶어서이 객체를 고유 속성으로 포함하는 다른 객체 ('watched')로 묶습니다. 'watched'를 대체하지 말고 다른 객체를'watched.sharedObject'에 할당하십시오. –

1

문제는 업데이트 방법에서 sharedObject가 처음에 다른 개체를 가리키는 개체를 대체한다는 것입니다. 컨트롤러가 이전 개체에 대한 참조를 계속 보유합니다.

sharedObject을 업데이트해야합니다. 참조 내 당신이

sharedObject.attr1= 'new value'; 
sharedObject.attr2= 'update value';