2013-08-02 9 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

कोणीय राउटर नियंत्रक को तत्काल करने से पहले हल/अस्वीकार करने के लिए 'समाधान' के मानों के लिए प्रतीक्षा करता है। फिर यह नियंत्रक में इंजेक्ट करने के लिए स्थानीय मानों का उपयोग करता है (कोणीय इंजेक्टर स्थानीय लोगों को पसंद करता है)। टीएल; डीआर: आप दो अलग-अलग 'स्कीमा' के साथ काम कर रहे हैं। –

उत्तर

-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

आपके उदाहरण में विधि 'प्राप्त' अभी भी वादा करता है, वादे का संकल्प नहीं, जो प्रश्न पूछ रहा है। –

5

आप जो चाहते हैं वह स्थगित बूटस्ट्रैप है। इस उद्देश्य के लिए पहले से ही एक प्लगइन लिखा गया है - https://github.com/philippd/angular-deferred-bootstraphttp://plnkr.co/edit/VfISHNULXRLe52NeAsn1?p=preview

* आप आस्थगित बूटस्ट्रैप के साथ मौजूदा एनजी-ऐप की जगह चाहिए

कोड स्निपेट - -

मैं plunkr पर एक उदाहरण बनाने

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

उसके बाद, आप नियंत्रक में वैसे भी स्कीमा का उपयोग कर सकते , मार्ग संकल्प की तरह सेवाओं या कारखाने। फैक्टरी

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

बिल्कुल वही जो मैं खोज रहा था, धन्यवाद - स्थगित बूटस्ट्रैपिंग उस घटक के साथ एक आकर्षण की तरह काम करता है! – conceptdeluxe

संबंधित मुद्दे