2016-09-13 3 views
1

주요 데이터, 세부 정보, 주소 등을 표시하는 사용자 페이지를 작성하려고합니다. 첫 번째로드를 만들 때 화면을 변경하고 사용자 페이지로 돌아갈 때까지 내가 이미 그 페이지에 갔다 간 약속 약속이 돌아 왔기 때문에 그것은 문제가된다.공장 해결 후 AngularJs 컨트롤러 값이 업데이트되지 않습니다.

내가 앱이 동결 느낌 만들기 때문에 모든 데이터가 resolved 후 그것은 단지 화면을 바꿀 것입니다 때문에, stateChangeresolve 동안로드 할이 데이터를 사용 (하지 않음)하고, 그렇지 않은 경우 수 시간이 좀 걸리면 페이지가 작동하지 않는 것 같습니다.

나는 또한 factory에와 $rootScope.$apply()합니다 ( controller에) $scope.$digest()를 사용했지만, 두 경우 모두가 나에게 digest running 오류를 제공합니다.

사용 올바른 방법이없는 한 .then()은 옵션이 아닙니다. 첫 번째로드 후 해당 페이지로 돌아 가면 오류가 발생하기 때문입니다.

나는 이것이 parent (추상)에서 controller이다로드하고하는 factory이 같은 그 값을 저장하고있어 방법 : 나는 또한 시작하기 때문에 모든 이들 데이터를로드 할 필요

//Parent Controller 
function parentController(requestFactory, storeFactory, $q) { 
    var 
     user = storeFactory.userGet(), 
     data = storeFactory.dataGet() 
     [...more load...]; 

    if(!user || !data ...) { 
     var promises = { 
      user: requestFactory.get('userGet'), 
      data: requestFactory.get('dataGet'), 
      [...more requests...] 
     }; 

     return $q.all(promises).then(function(resolve){ 
      storeFactory.userAdd(resolve.user); 
      storeFactory.dataAdd(resolve.data); 
      [...more update...] 
     }); 
    } 
} 

//Factory 
function storeFactory() { 
    var 
     data = null, 
     user = null, 
     address = null, 
     endereco = null; 

    var service = { 
     userGet: _userGet, 
     userAdd: _userAdd, 
     [...more definitions...] 
    }; 
    return service; 


    function _userGet() { 
     return user; 
    } 
    function _userAdd(data) { 
     return user = data; 
    } 
    [...more functions...] 
} 

// child Controller 01 
function child1Controller(storeFactory) { 
    vm.user = storeFactory.userGet(); 
} 

// child Controller 02 
function child2Controller(storeFactory) { 
    vm.address = storeFactory.addressGet(); 
} 

을 이 종속 데이터는, 예를 들어, 주소, 사용자에 따라 등


그래서, 페이지 사용자가 액세스하는 경우> 주소는 아무 것도 표시되지 않는 것 화면을 볼 수 있습니다. 그러나 다른 페이지로 이동하여 돌아 왔을 때 모든 것이 보여지기 때문에 표시됩니다.

이 문제를 해결할 방법이 있습니까? 데이터를 자동으로 업데이트 하시겠습니까?

+1

ui-router를 사용하는 경우 상태가 전환되기 전에 약속이 해결되어 데이터가 저장됩니다. 그렇지 않으면 컨트롤러에서 해결할 약속을 기다리고 그에 따라 UI를 업데이트하십시오. – reptilicus

+0

@reptilicus하지만 ui-router 해결에서 사용하고 싶지 않습니다. 페이지가 작동하지 않는다고 생각하기 때문에 데이터가 해결되어 약간의 시간이 걸릴 수 있습니다. 컨트롤러에서 해결 방법을 사용할 때 해결 후 UI를 업데이트하는 데 문제가 있습니다. – celsomtrindade

+0

그럼, 많은 약속이 해결되기를 기다리고 있다면 잠시 시간이 걸릴 것입니다. 약속을 그룹으로 나누어 UI를 업데이트하거나 요청을 줄이는 방법을 찾아야합니다. – reptilicus

답변

0

이 문제를 해결할 수있는 방법은 여러 배열을 만드는 대신 공장에서 중첩 배열이있는 단일 개체를 만드는 것입니다. 또한 컨트롤러에서 특정 배열을 VM에 직접 설정할 수 없으며 객체 내부에 배열을 설정해야합니다. 이렇게하면 자동으로 업데이트됩니다.

//Factory 
var data = { 
    user: null, 
    address: null, 
    [...] 
}; 

function _userAdd(value) { 
    return data.user = value; 
} 
[...etc...] 

//Controller 
function child1Controller(storeFactory) { 
    vm.maindata = storeFactory.data; 
} 

이 일 후에, 나는 다음과 같이 뷰에 중첩 된 배열을 지정해야합니다

<p>{{vm.maindata.user}}</p> 

<ul> 
    <li ng-repeat="address in vm.maindata.address track by $index">{{address}}</li> 
</ul> 

가 작동하고 있지만, 그것은 올바른 방법으로 같은 느낌하지 않습니다 그러니,이 결과를 얻는 더 좋은 방법이 있다면, 나는 제안에 대해 개방적이다.

관련 문제