我有一个名为’player’的服务,当flash对象完成加载时,我需要更新服务。
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”实例。有没有办法做到这一点?我只想要一个玩家的实例,但是我需要从外部的javascript初始化它。
那么,我看不到你正在做的所有事情,但是你可能大概是在那里的1/2路。
Here is a working plunk of what I’m about to describe
inject.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注入到您的服务中,而不是使用窗口对象来维护您的服务的可测试性。>一个指令可能是更好的DOM操作选择,比如创建一个Flash电影播放器。