2013-08-02 3 views
12

해당 정보에 의존하는 서비스를 설정하기 전에 서버에서 일부 정보 (스키마)를 가져와야합니다.해결 된 약속을 서비스에 삽입

내 서버는 모델의 다양한 속성을 정의하는 스키마를 제공합니다. 스키마에 의존하는 다른 서비스로 내가 스키마 객체를 삽입하고 싶은

services.factory('schema', function($q, $http) { 
    var deferred = $q.defer(); 
     $http.get('schema/').then(function(response) { 
     schema = // some function of response.data 
     deferred.resolve(schema); 
    }, function() { 
     deferred.reject('There was a problem fetching the schema'); 
    }); 
     return deferred.promise; 
}); 

, 그리고 약속 : 내 각 코드에서,이 스키마를 유도 할 수있는 서비스가있다. $ routeProvider은 우리가 컨트롤러에 대해이 작업을 수행 할 수 있습니다

app.config(function($routeProvider) { 
    $routeProvider. 
     when('/', { 
      controller: 'SomeCtrl', 
      resolve: { 
       schema: 'schema' 
      }, 
      ... 
     }); 
}); 

을이 날 같은 SomeCtrl을 정의 할 수 있습니다 :

services.factory('SomeService', function(schema) { 
    // schema is a promise 
    schema.then(function(schema) { 
     ... 
    }); 
}); 

인가 :

controllers.controller('SomeCtrl', function($scope, schema) { 
    // schema is an object 
    ... 
}); 

그러나 서비스

, 내가해야 할 내가 할 수있는 방법이 있니?

+0

아니에 대한

샘플 코드, 즉, 적어도 지금은 어떻게 작동하는지 그냥. – aet

+0

각도 라우터는 컨트롤러를 인스턴스화하기 전에 해결/거부 할'resolve' 내의 값을 대기합니다. 그런 다음 로컬 값을 사용하여 컨트롤러에 주입합니다 (각 주입기는 현지인을 선호합니다). TL : 당신은 두 개의 서로 다른 스키마를 사용하고 있습니다. –

답변

-1

서비스 기능은 함수를 호출 할 때 즉시 본문을 평가하기 때문에 약속이 있습니다. 일반적으로 서비스는 객체를 반환해야 소비자 (다른 서비스, 컨트롤러 등)가 필요할 때 해당 객체의 함수를 호출 할 수 있습니다.

services.factory('schema', function($q, $http) { 
return { 
    get: function() { 
    var deferred = $q.defer(); 
    $http.get('schema/').then(function(response) { 
     schema = // some function of response.data 
     deferred.resolve(schema); 
    }, function() { 
     deferred.reject('There was a problem fetching the schema'); 
    }); 
    return deferred.promise; 
    } 
} 

});

+0

당신의 예제에서'get' 메소드는 약속의 해결책이 아니라 약속을 반환합니다. 이것은 질문이 요구하는 것입니다. –

5

원하는 것은 지연된 부트 스트랩입니다. 이미이 목적을 위해 작성된 플러그인이 있습니다 (https://github.com/philippd/angular-deferred-bootstrap). 당신이 컨트롤러 어쨌든 스키마를 사용할 수 있습니다, 그리고

angular.element(document).ready(function() { 
    deferredBootstrapper.bootstrap({ 
     element: document.body, 
     module: 'plunker', 
     resolve: { 
      schema: ['$http', 
       function($http) { 
        return $http.get('schema.json'); 
       } 
      ] 
     } 
    }); 
}); 

- 당신은 이연 부트 스트랩 기존 NG-응용 프로그램을 교체해야합니다 * http://plnkr.co/edit/VfISHNULXRLe52NeAsn1?p=preview

코드 조각 -

나는 plunkr에서 예제를 만들 , 서비스 또는 공장에서 경로를 확인하는 것과 같습니다. 공장

app.factory('SomeService', function(schema){ 
    return { 
     getTitle: function() { 
      return schema.title; 
     } 
    } 
}); 
+0

정확하게 내가 뭘 찾고 있었는지 고마워요. 지연된 부트 스트래핑은 그 구성 요소가있는 매력처럼 작동합니다! – conceptdeluxe