Подтвердить что ты не робот

AngularJS: мне нужно обновить сервис извне angular

У меня есть служба под названием "player", и мне нужно обновить службу, когда объект флэш-объекта будет завершен.

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')

но он возвращает новый экземпляр "игрока", в то время как мне нужно обновить экземпляр, уже созданный в модуле. Есть ли способ сделать это? Мне нужен только один экземпляр проигрывателя, но мне нужно его инициализировать из-за пределов javascript.

4b9b3361

Ответ 1

Хорошо, я не могу видеть все, что вы делаете, но вы, вероятно, около 1/2 пути.

Вот рабочий план того, что я собираюсь описать

injector.get() должен возвращать тот же экземпляр службы, что и в вашем приложении. Вероятно, вы просто видите проблему, которая заставляет вас думать, что у вас другой экземпляр.

Итак, что вам нужно сделать:

  • Убедитесь, что то, что вы добавляете в свою область действия из своей службы, - это ссылка объект. Если это примитивный тип, он не будет той же ссылкой, поэтому он не будет обновляться.
  • Обязательно откройте область angular с помощью 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 в свою службу, а не использовать объект окна, чтобы поддерживать тестируемость вашей службы.
  • Директива, вероятно, является лучшим выбором для манипуляций с DOM, таких как создание проигрывателя Flash-роликов.