2013-08-16 11 views
6

पर कॉल ट्रिगर नहीं करता है मैंने दो अंगुलरजेएस सेवाओं को परिभाषित किया है ... एक यूट्यूब प्लेयर एपीआई के लिए है, और अन्य यूट्यूब आईफ्रेम डेटा एपीआई के लिए है। वे इस तरह दिखेगा:एंगुलरजेएस एक सेवा से प्रसारित करता है जो दूसरी सेवा

angular.module('myApp.services',[]).run(function() { 
    var tag = document.createElement('script'); 
    tag.src = "//www.youtube.com/iframe_api"; 
    var firstScriptTag = document.getElementsByTagName('script')[0]; 
    firstScriptTag.parentNode.insertBefore(tag, firstScriptTag); 
}) 
.factory('YtPlayerApi', ['$window', '$rootScope', function ($window, $rootScope) { 
    var ytplayer = {"playerId":null, 
    "playerObj":null, 
    "videoId":null, 
    "height":390, 
    "width":640}; 

    $window.onYouTubeIframeAPIReady = function() { 
     $rootScope.$broadcast('loadedApi'); 
    }; 

    ytplayer.setPlayerId = function(elemId) { 
     this.playerId=elemId; 
    }; 

    ytplayer.loadPlayer = function() { 
     this.playerObj = new YT.Player(this.playerId, { 
      height: this.height, 
      width: this.width, 
      videoId: this.videoId 
     }); 
    }; 
    return ytplayer; 
}]) 
.factory('YtDataApi', ['appConfig','$http', function(cfg,$http){ 
    var _params = { 
     key: cfg.youtubeKey 
    }; 
    var api="https://www.googleapis.com/youtube/v3/"; 
    var yt_resource = {"api":api}; 
    yt_resource.search = function(query, parameters) { 
     var config = { 
      params: angular.extend(angular.copy(_params), 
         {maxResults: 10, 
         part: "snippet"}, parameters) 
      }; 
     return $http.get(api + "search?q=" + query, config); 
    }; 
    return yt_resource; 
}]); 

(यह भी ध्यान रखें कि मेरे खिलाड़ी सेवा के 'setPlayerId' समारोह एक कस्टम निर्देश द्वारा कहा जाता है ... लेकिन यह है कि मेरे सवाल के लिए महत्वपूर्ण नहीं है)।

तो, यहां समस्या है। मुझे यह सुनिश्चित करने की ज़रूरत है कि वीडियो आईडी सेट करने और प्लेयर बनाने से पहले प्लेयर एपीआई कोड लोड हो गया है, यही कारण है कि मैंने इसे 'loadedApi' संदेश प्रसारित किया है। और यह महान काम करता है, अगर मैं तो मेरे नियंत्रक में एक हार्ड-कोडेड वीडियो आईडी, इस तरह से पारित:

function ReceiverCtrl($scope,$rootScope,$routeParams,ytplayer,ytdataapi) { 
    $scope.$on('loadedApi',function() { 
    ytplayer.videoId='voNEBqRZmBc'; 
    ytplayer.loadPlayer(); 
    }); 
} 

हालांकि, मेरे वीडियो आईडी निर्धारित नहीं किया जा जाएगा, जब तक मैं डेटा API सेवा के साथ एक API कॉल करने , इसलिए मुझे यह भी सुनिश्चित करना होगा कि उस कॉल के परिणाम वापस आ गए हैं। और वह है जहाँ मैं समस्याओं में चल रहा हूँ ... अगर मैं कुछ इस तरह करते हैं:

 $scope.$on('loadedApi',function() { 
     ytdataapi.search("Mad Men", {'topicId':$routeParams.topicId, 
            'type':'video', 
            'order':'viewCount'}) 
     .success(function(apiresults) { // <-- this never gets triggered 
      console.log(apiresults); // <-- likewise, this obviously doesn't either 
     }); 
     }); 

तो डेटा सेवा के साथ बातचीत कभी नहीं किसी कारण से होता है। मुझे पता है कि डेटा सेवा ठीक काम करती है, क्योंकि जब मैं इसे $ कथन से अनजान करता हूं, तो यह एपीआई परिणाम देता है। लेकिन कभी-कभी विलंबता यह बनाती है कि परिणाम खिलाड़ी सेवा में उनका उपयोग करने के लिए पर्याप्त तेज़ी से वापस नहीं आते हैं। प्लेयर एपीआई तैयार संदेश प्राप्त करने के बाद डेटा खोज करने के लिए मैं क्या कर सकता हूं, इस पर कोई विचार है, लेकिन फिर भी दो सेवाओं को दो अलग-अलग सेवाओं के रूप में रखें (क्योंकि अन्य नियंत्रक केवल एक या दूसरे का उपयोग करते हैं, इसलिए मैं नहीं चाहता वे सेवा स्तर पर एक-दूसरे पर निर्भर हैं)?

उत्तर

2

इसे समझ लिया;

function ReceiverCtrl($scope,$rootScope,$routeParams,ytplayer,ytdataapi) { 
    $scope.$on('loadedApi',function() { 
    ytdataapi.search("",{'topicId':$routeParams.topicId,'type':'video','maxResults':1,'order':'viewCount'}).success(function(apiresults) { 
     ytplayer.videoId=apiresults.items[0].id.videoId; 
     ytplayer.loadPlayer(); 
    }); 
    $scope.$apply(); 
    }); 
} 

ऐसा कोई है जो, क्यों यह काम करता है पर प्रकाश डाला सकता है, हालांकि है। मैं इस तरह $ गुंजाइश) कॉल करने के लिए $ लागू (था,? $ scope। $ digest() भी काम करता है ... लेकिन मैंने सोचा था कि उन विधियों का उपयोग केवल तभी किया जाता था जब आपको कुछ जावास्क्रिप्ट कोड के कारण बाइंडिंग अपडेट करने की आवश्यकता होती है, जो कोणीय को अवगत नहीं है। क्या घोंसला मुझे यहां कर रहा है (मुझे नहीं लगता कि यह चाहिए, क्योंकि मेरी ytdataapi सेवा $ http का उपयोग कर रही है)?

+0

लगता है कि खोज फ़ंक्शन दायरे में कोई भी परिवर्तन नहीं पेश करता है, यह सिर्फ http अनुरोध को सक्रिय करता है। यह अजीब है। – Diryboy

+0

हैलो, हमारे साथ अपना जवाब साझा करने के लिए धन्यवाद! एक बात जो मुझे समझ में नहीं आती है, वैसे ही आप ट्यूब प्लेयर को एक डोम तत्व से कैसे बांधते हैं। और साथ ही, प्लगइन को फिर से लोड किए बिना आप एक दूसरे के बाद कई अलग-अलग वीडियो कैसे लोड कर सकते हैं –

+0

यहां एक गिथब रेपो है जो इस प्रश्न के विकास की तरह है: https://github.com/jlmcdonald/angular-youtube ... इसमें खिलाड़ी को डीओएम तत्वों को बाध्य करने के लिए एंग्लूयर निर्देश शामिल हैं। मैंने अभी तक कई वीडियो लोड करने के बारे में सोचा नहीं है, लेकिन यह कठिन नहीं होना चाहिए ... शायद मैं इसे रेपो कोड में जोड़ दूंगा। – jlmcdonald

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