2012-11-28 14 views
20

के बाहर से एक सेवा को अपडेट करने की आवश्यकता है। मेरे पास 'प्लेयर' नामक एक सेवा है और फ्लैश ऑब्जेक्ट लोड होने पर मुझे सेवा को अपडेट करने की आवश्यकता है।कोणीयजेएस: मुझे कोणीय

mySongPlayer.factory('player', function() { 

var isPlayerLoaded = false; 
var playerHolder = ''; 

window.playerReady = function(thePlayer) { 
    playerHolder = window.document[thePlayer.id]; 
    addListeners(); 
    isPlayerLoaded = true; 
} 

var flashvars = { 
    file:"", 
    autostart:"true", 
    skin: "/skins/glow/glow.zip", 
} 

var params = { 
    allowfullscreen:"false", 
    allowscriptaccess:"always" 
} 

var attributes = { 
    id:"player1", 
    name:"player1"      
} 

swfobject.embedSWF("/player.swf", "player_placeholder", "100%", "40", "9.0.115", false, flashvars, params, attributes); 

var playObj; 
return playObj || (playObj = { 
    currentId: 'test', currentUrl: 'url', playerHolder: '' 
}); 
});​ 

मैं कैसे

angular.element(DOMElement).injector().get('player') 

का उपयोग कर सेवा का उपयोग करने जानते हैं, लेकिन यह खिलाड़ी 'का एक नया उदाहरण देता है, जबकि मैं पहले से ही मॉड्यूल में बनाया उदाहरण अपडेट करना होगा। क्या इसे करने का कोई तरीका है? मुझे केवल खिलाड़ी का एक उदाहरण चाहिए, लेकिन मुझे इसे बाहरी जावास्क्रिप्ट से प्रारंभ करना होगा।

उत्तर

42

ठीक है, मैं वास्तव में आप जो कुछ भी कर रहे हैं उसे नहीं देख सकता, लेकिन आप शायद लगभग 1/2 तरीके से हैं।

Here is a working plunk of what I'm about to describe

injector.get() कि आपके ऐप में के रूप में सेवा की एक ही उदाहरण लौट जाना चाहिए। आप शायद एक समस्या देख रहे हैं जो आपको लगता है आपके पास एक अलग उदाहरण है।

तो तुम क्या करने की जरूरत है:

  • सुनिश्चित करें कि क्या आप अपनी सेवा से अपने दायरे में डाल रहे हैं एक वस्तु संदर्भ है। यदि यह एक आदिम प्रकार है, तो यह वही संदर्भ नहीं होगा, इसलिए यह अपडेट नहीं होगा।
  • angular.element(DOMElement).scope() के साथ अपने कोणीय तत्व का दायरा प्राप्त करना सुनिश्चित करें और फिर $apply() पर कॉल करें।

    app.controller('MainCtrl', function($scope, myService) { 
        // Set a var on the scope to an object reference of the 
        // (or from the) service. 
        $scope.myService = myService; 
    }); 
    
    app.factory('myService', function(){ 
        return { 
        foo: 'bar' 
        }; 
    }); 
    
    //do a little something to change the service externally. 
    setTimeout(function(){ 
        //get your angular element 
        var elem = angular.element(document.querySelector('[ng-controller]')); 
    
        //get the injector. 
        var injector = elem.injector(); 
    
        //get the service. 
        var myService = injector.get('myService'); 
    
        //update the service. 
        myService.foo = 'test'; 
    
        //apply the changes to the scope. 
        elem.scope().$apply(); 
    }, 2000) 
    

    अन्य विचार::

    • आप शायद आपकी सेवा में $window इंजेक्षन करने के बजाय विंडो ऑब्जेक्ट का उपयोग करें, आपकी सेवा की testability बनाए रखना चाहते हैं

    कोड यह ।

  • एक फ्लैश मूवी प्लेयर के निर्माण जैसे डीओएम मैनिपुलेशन के लिए एक निर्देश शायद बेहतर विकल्प है।
+0

इसे 'स्कोप()। MyService' पर क्यों लागू नहीं किया जा सकता है? 'इंजेक्टर() प्राप्त करें 'स्कोप() प्राप्त करने में क्या अंतर है। myService' – pocesar

+6

इस विशेष उदाहरण में, आप कर सकते हैं। हालांकि, यह केवल तभी काम करेगा जब सेवा को एक दायरे की संपत्ति के रूप में जोड़ा गया हो, जो हमेशा मामला नहीं होता है। तो 'injector.get()' वह है जिसे आप उपयोग करना चाहते हैं यदि आप चाहते थे कि यह * सभी * मामलों में काम करे। –

+0

'document.querySelector ('[ng-controller]') का उपयोग करने से आपको क्या लाभ होता है? 'angor.element()' के तर्क के रूप में '' [ng-controller] 'या '' [ng-app] 'का उपयोग करके बस उतना ही अच्छा लगता है? – Superole

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