2014-09-26 4 views
0

여기 내 일반적인 문제가 있습니다. 값을 얻기 위해 아약스 호출을해야하는 팩토리가 있습니다. 이 팩토리를 주입하고 싶지만 아약스 호출이 해결 된 후에 만 ​​주입됩니다. 즉, 이미 값이 있어야합니다. 이것이 가능한가? 좀 더 나은 옵션을 제공 할 수 있도록 상황을 알려 드리겠습니다.약속에 대한 각도 해결 의존성

저는 UserFactory가 있습니다.

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

    function(){ 
     //ajax call to get the user object 
     //dont allow injection until user has arrived 
    } 
]); 


var home = angular.module('home',[]); 
home.controller('UserInfoController',[ 
    'UserFactory',//I don't want this resolved until the ajax call has completed 
    function(User){ 
     //bind user data to the view 
    } 
]); 

이것이 가능합니까? 아니면 내가 잘못 생각할 것인가? 약속이 매번 사용되지 않아도 사용자의 정보에 액세스 할 수 있기를 바랍니다.

+0

난 당신이 약속을 사용하는 방법에 대한 우려 이유를 모르겠어요. 어쨌든 사용자가 있는지 확인하는 것은 어떨까요? 그렇지 않다면 공장 약속을 사용하여 설정하십시오. – Scott

답변

0

할 수있는 일은 사용자 데이터를 기억하도록 공장을 설정하는 것입니다. 컨트롤러에서 그럼이

app.factory('userFactory', function ($http){ 
    return { 
     getUser: function(){ 
      return $http({ 
       method: 'GET', 
       url: '' 
      }); 
     }, 
     currentUser: {} 
    }; 
}); 

같은

뭔가, currentUser 아무것도가 있는지 확인하십시오. 그렇지 않으면 getUser 호출을 만들어 currentUser에 저장합니다. 팩토리가 싱글 톤이기 때문에 사용자 데이터는 항상이 팩토리 안에 존재하며 필요할 때마다 사용자 데이터를 삽입 할 수 있습니다. 당신은 아직도 그것을 주입하기 전에 거기에 사용자 데이터가 필요한 경우 http://jsfiddle.net/4m6gmsw2/

당신이 해결 사용에 대해 살펴 수행 할 수 있습니다 : 여기

은 예입니다 상태 라우터에서 https://thinkster.io/egghead/resolve/

0

를위한 속성을 해결할 수있다 각 주. 그런 다음 컨트롤러

.state({ 
    name: 'myState', 
    resolve: { 
    user: function(myService) { 
     return myService.asyncGet(); 
    } 
    } 

:

.controller('myController', function(user) { 
    $scope.myData = user.data; //no messy promises 
});