Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在服务(工厂)的事件中修改范围?_Javascript_Angularjs_Angularjs Scope_Angularjs Service - Fatal编程技术网

Javascript 如何在服务(工厂)的事件中修改范围?

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

我创建了一个工厂,创建一个音频标签,播放不同的音频文件

我想做的是,使加载的gif在加载新音频文件时出现,然后在加载时消失

我的gif有一个简单的html标记:

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