2013-08-02 7 views
12

Bu bilgilere dayanan bir dizi hizmet kurmadan önce sunucudan bazı bilgiler (şema) almam gerekir.Hizmete çözümlenmiş bir sözün enjekte edilmesi

Sunucum, bir modelin çeşitli özelliklerini tanımlayan bir şema sunuyor. şema bağlı diğer hizmetlerle içine ben şema nesne enjekte etmek istiyorum

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; 
}); 

değil, söz,: Benim açısal kodunda, bu şemayı alır bir servis var. $ RouteProvider bize denetleyicileri için bunu sağlar:

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

ve bu beni böyle SomeCtrl tanımlamanızı sağlar:

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

mi:

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

Fakat hizmetler için

, yapmam gereken Bunu yapabileceğim herhangi bir yol var mı?

+0

Hayır için

Örnek Kod, işte bu en azından şimdilik, nasıl çalıştığını sadece bu. – aet

+0

Açısal yöneltici, denetleyicinin başlatılmasından önce çözülecek/reddedecek olan "çözme" içindeki değerleri bekler. Daha sonra kontrolöre enjekte etmek için yerel değerleri kullanır (açısal enjektör lokalleri tercih eder). TL; DR: İki farklı şema ile çalışıyorsunuz. –

cevap

-1

Söz verdiğinizde, hizmet işleviniz bunu çağırdığınızda (işlevler gibi) hemen vücudunuzu değerlendirir. Normal olarak, bir hizmet, bir nesneyi iade etmelidir, böylece tüketici (başka bir servis, denetleyici, her neyse), ihtiyaç duyulduğunda, o nesnenin işlevlerini çağırabilir. ILLUSTRATORNG.

+0

Örneğinizde, 'get' yöntemi, sözün sorusunu değil, vaatin çözünürlüğünü değil, bir söz verir. –

5

Ne istiyorsan ertelenmiş önyükleme. Bu amaçla yazılmış bir eklenti var - https://github.com/philippd/angular-deferred-bootstrap. Eğer denetleyici içinde zaten şema kullanabilirsiniz Ardından

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

- Sen ertelenmiş bootstrap ile mevcut ng-app değiştirmelisiniz * http://plnkr.co/edit/VfISHNULXRLe52NeAsn1?p=preview

Kod Parçacığı -

Ben plunkr bir örnek oluşturmak sadece rota çözümü gibi hizmetler veya fabrika. Fabrika

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

Tam olarak ne aradığımı, teşekkürler - ertelenmiş önyükleme bu bileşenin cazibesi gibi çalışır! – conceptdeluxe