Javascript 如何在服务(工厂)的事件中修改范围?
我创建了一个工厂,创建一个音频标签,播放不同的音频文件 我想做的是,使加载的gif在加载新音频文件时出现,然后在加载时消失 我的gif有一个简单的html标记:Javascript 如何在服务(工厂)的事件中修改范围?,javascript,angularjs,angularjs-scope,angularjs-service,Javascript,Angularjs,Angularjs Scope,Angularjs Service,我创建了一个工厂,创建一个音频标签,播放不同的音频文件 我想做的是,使加载的gif在加载新音频文件时出现,然后在加载时消失 我的gif有一个简单的html标记: <img src="loading.gif" ng-show="displaySoundFileLoader"/> 像这样,我可以用一个按钮加载并播放一个声音,然后根据需要重新播放(我不想显示播放器) 问题是,当我尝试这样做时: audio.audioElement.oncanplaythrough = function
<img src="loading.gif" ng-show="displaySoundFileLoader"/>
像这样,我可以用一个按钮加载并播放一个声音,然后根据需要重新播放(我不想显示播放器)
问题是,当我尝试这样做时:
audio.audioElement.oncanplaythrough = function () {
$scope.displaySoundFileLoader = false;
alert('test');
};
我试过使用参数中的scope,我试过很多方法,但都不起作用(警报测试有效)。如何在工厂对象事件中修改作用域?我认为您需要
$scope.$apply(函数(){$scope.displaySoundFileLoader=false;})代码>。您正在为Angular之外的内容设置事件处理程序,Angular将不知道如何更新视图,即使您正在更改范围。$scope.$apply
将处理这个问题,最好的方法是为这个加载程序创建一个指令,然后观察displaySoundFileLoader,每当它被更改时,您都会执行一个apply。此外,您还可以使用插件和事件侦听器。这两种建议都是正确的。要使代码正常工作,请使用$scope.apply
包装作业。这将告诉Angular运行摘要循环。第二个答案是正确的,因为这是你在一开始就应该做的,而不是使用工厂。谢谢@Ian,它可以工作!别犹豫,把它贴出来作为我的答案,让我相信它。对于z.a.和vaidik,今天下午我将尝试探索更多关于指令部分的内容,感谢您的帮助,我做这个项目是为了训练自己如何使用“正确的方法”!
audio.audioElement.oncanplaythrough = function () {
$scope.displaySoundFileLoader = false;
alert('test');
};