2013-04-02 6 views
5

मैंने जो किया है। मैं विशिष्ट निर्देश के साथ एक नियंत्रक में जेसन के साथ यूट्यूब एपीआई से वीडियो की एक सूची पुनर्प्राप्त करता हूं। जेसन में वीडियो की सूची और वीडियो स्वयं विवरण शामिल हैं।एंगुलरजेएस नियंत्रक से दूसरे नियंत्रक को डेटा पास करता है

मैं क्या करना चाहता हूं। किसी वीडियो पर क्लिक करते समय, मैं चाहता हूं कि वीडियो के विवरण अन्य नियंत्रक बी के साथ अन्य नियंत्रक बी के साथ प्रदर्शित हों, जो पहले मैं अनुरोध करता हूं। controllerA

+0

आपको एक सेवा बनाने की आवश्यकता है: इस पोस्ट को देखें। http://stackoverflow.com/a/12009408/2104976 – callmekatootie

उत्तर

15

यह आम संदेह में से एक है में $ http सेवा इस्तेमाल होता है जब AngularJS के साथ शुरू -

तो मेरे सवाल का controllerB को

नोट controllerA से डेटा पारित करने के लिए कैसे है। आपकी आवश्यकता से, मेरा मानना ​​है कि आपका सबसे अच्छा विकल्प create a service है जो मूवी सूची पुनर्प्राप्त करता है और फिर controllerA और controllerB दोनों में इस सेवा का उपयोग करता है।

module.factory('youtube', function() { 
    var movieListCache; 

    function getMovies(ignoreCache) { 
    if (ignoreCache || !movieListCache) { 
     movieListCache = $http...; 
    } 

    return movieListCache; 
    } 

    return { 
    get: getMovies 
    }; 
}); 

फिर आप दोनों नियंत्रकों में इस सेवा को इंजेक्ट करते हैं।

module.controller('controllerA', ['youtube', function(youtube) { 
    youtube.get().then(function doSomethingAfterRetrievingTheMovies() { 
    }); 
}]); 

module.controller('controllerB', ['youtube', function(youtube) { 
    youtube.get().then(function doAnotherThingAfterRetrievingTheMovies() { 
    }); 
}]); 

आप controllerA की जरूरत है की जानकारी में हेरफेर करने से पहले आप बी में इसका इस्तेमाल करते हैं तो आप सेवा में अधिक तरीकों बना सकते हैं। कुछ इस तरह:

module.factory('youtube', function($q) { 
    var movieListCache, 
     deferred = $q.defer(); 

    function getMovies(ignoreCache) { 
    if (ignoreCache || !movieListCache) { 
     movieListCache = $http...; 
    } 

    return movieListCache; 
    } 

    function getChangedMovies() { 
    return deferred.promise; 
    } 

    function setChangedMovies(movies) { 
    deferred.resolve(movies); 
    } 

    return { 
    get: getMovies, 
    getChanged: getChangedMovies, 
    setChanged: setChangedMovies 
    }; 
}); 

आप नहीं जानते कि क्या $q है, take a look at the docs। एसिंक ऑपरेशंस को संभालना अनिवार्य है।

  1. आप नियंत्रकों पिता हैं $rootScope
  2. पर वीडियो को बचा सकता है और बेटे को आप इस्तेमाल कर सकते हैं एक दूसरे को नियंत्रक को पुनः प्राप्त करने की आवश्यकता होती है:

    वैसे भी, इस कार्य को भी पूरा करने के कुछ अन्य तरीके हैं

IMHO, # 1 एक सामान्य समाधान है; मैं इसका उपयोग केवल तभी करूँगा जब कोई दूसरा विकल्प न हो। और # 2 उपयोगी है यदि आपके पास इन नियंत्रकों के बीच संवाद करने की आंतरिक आवश्यकता है, जैसे किसी अन्य के अस्तित्व के बारे में किसी को कॉन्फ़िगर करना या उसे देना। example here है।

आप जो करना चाहते हैं वह स्टेटल सिंगलटन जानकारी साझा करना है; इसलिए, एक सेवा जाने का रास्ता है।

+0

मैं आधिकारिक दस्तावेज पढ़ता हूं और एक कारखाना() है। क्या आप कारखाने() और इसके बिना उपयोग करने के बारे में त्वरित व्याख्या कर सकते हैं? धन्यवाद। – vzhen

+0

वे सभी मॉड्यूल के लिए सेवाओं का पर्दाफाश करते हैं। अंतर अपने परिष्कार स्तर में रहता है। जबकि प्रदाता सबसे परिष्कृत है, सजावट की अनुमति भी देता है, और सेवा सबसे सीधे आगे है। अच्छे स्पष्टीकरण और उदाहरण हैं [यहां] (https://groups.google.com/forum/#!msg/angular/56sdORWEoqg/b8hdPskxZXsJ), [यहां] (https://groups.google.com/d/msg/कोणीय/56sdORWEoqg/-TgFGhm4NYAJ), [यहां] (http://stackoverflow.com/a/13763886/179138), और [यहां] (http://jsfiddle.net/pkozlowski_opensource/PxdSP/14/)। यदि आप अभी भी समझ में नहीं आते हैं, तो मुझे चैट में कॉल करें और मैं आपको समझाऊंगा। मेरा कोड फिक्स्ड –

+0

हाय, मुझे समझ में आया कि एक सेवा बनाना। लेकिन मुझे लगता है कि मेरी समस्या नियंत्रक के बीच जोड़ने के बारे में नहीं है। क्या आप अभी चैट करने के लिए स्वतंत्र हैं? बीटीडब्ल्यू, स्टैक ओवरफ्लो में कैसे चैट करें? – vzhen

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