27

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

ただし、モジュールですでに作成されているインスタンスを更新する必要がある間は、「player」の新しいインスタンスが返されます。これを行う方法はありますか?プレーヤーのインスタンスが1つだけ必要ですが、JavaScriptの外部から初期化する必要があります。

4

1 に答える 1

56

ええと、私はあなたがしていることのすべてを実際に見ることはできませんが、あなたはおそらくそこに約半分の道を進んでいます。

これが私がこれから説明しようとしていることの実用的なプランクです

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サービスのテスト容易性を維持するために、windowオブジェクトを使用するのではなく、サービスに注入することをお勧めします。
  • ディレクティブは、Flashムービープレーヤーの作成などのDOM操作におそらく適しています。
于 2012-11-28T20:45:09.397 に答える