2012-11-28 18 views
20

dışından güncellemem gerekiyor. 'Player' adlı bir servisim var ve bir flash nesnesi yüklenmesi bittiğinde servisi güncellemem gerekiyor. AngularJS: Bir hizmeti köşeli

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: '' 
}); 
});​ 

Ben

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

kullanarak hizmete erişmek için biliyorum ama zaten modülünde oluşturulan örneği güncellemeniz gerekir iken 'oyuncu' yeni bir örneğini döndürür. Bunu yapmanın bir yolu var mı? Sadece oyuncunun bir örneğini istiyorum, ama onu dış javascript'ten başlatmalıyım.

cevap

42

Aslında, yaptığınız şeyi gerçekten göremiyorum, ancak muhtemelen yaklaşık 1/2 yoldasınız.

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

injector.get() uygulamanızda ne kadar Hizmetin aynı örneğini iade edilmelidir. Muhtemelen sadece 'u düşünen bir sorunu görüyorsunuz, farklı bir örneğiniz var.

Yani yapmanız gereken şudur:

  • size hizmetten kapsamında koyarak şeyin bir nesne referans olduğundan emin olun. İlkel bir türse, aynı referans olmayacak ve güncellenmeyecek.
  • Açısal öğenizin kapsamını angular.element(DOMElement).scope() ile aldığınızdan emin olun ve üzerinde $apply() numaralı telefonu arayın. Muhtemelen hizmete $window enjekte yerine hizmetinizin edilebilirliğini korumak için, pencere nesnesini kullanmak istediğiniz

    • :

      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) 
      

      Diğer düşünceler: Burada

  • kod . Bir yönlendirici, bir Flash film oynatıcısının oluşturulması gibi DOM manipulasyonu için muhtemelen daha iyi bir seçimdir.
+0

neden 'scope(). MyService' için doğrudan uygulanamaz? enjektör() 'ın kullanılış farkı nedir? get 'to" scope(). myService " – pocesar

+6

Bu örnekte, yapabilirsiniz. Ancak, bu yalnızca hizmetin kapsamın bir özelliği olarak eklendiğinde çalışır, bu her zaman böyle olmaz. Yani 'injector.get()', bunu * tüm * vakalarda çalışmak istediğinizde kullanmak zorunda olduğunuz şeydir. –

+0

'document.querySelector ('[ng-controller]')' kullanarak ne kazanıyorsunuz? sadece '' [ng-controller] ''veya'' [ng-app] ''angular' angular.element()' argümanı olarak sadece iyi çalışıyor gibi görünüyor? – Superole