2013-05-03 84 views
1

我想不断监视来自Angular的全局变量的值。 我有一个录制麦克风数据并将其推送到全局变量的Flash动画。 我引用这个变量从角是这样的:从AngularJS监视全局变量

$scope.audioData = $window.audioData; 
$scope.$watch('audioData', function() { 
    console.log("audio in angular!:", $scope.audioData.length); 
}); 

,并在HTML我已经把:

<h1>{{audioData.length}}</h1> 

在HTML我可以看到我录后的音频数据被改变,但手表功能不被称为,而它是录音,我需要将音频流式传输到服务器。

+1

观看'audioData.length',或使用['$ watch'](http://docs.angularjs.org/api/ng.$ro​​otScope.Scope#$watch)的第三个参数。 – Yoshi 2013-05-03 11:48:15

+0

不幸的是,这不起作用。该功能仍然只在录制停止后被调用(单击按钮)。 – dndr 2013-05-03 11:54:35

+1

你可能也想在某处使用['$ apply'](http://docs.angularjs.org/api/ng.$ro​​otScope.Scope#$apply)。 – Yoshi 2013-05-03 11:56:36

回答

2

这里有两点需要注意。

首先是$watch默认只钟表对象和阵列的身份,因此,如果有变化内部值它不会注意到。这可以通过观察length或使用Yoshi提到的第三个参数来解决。

第二件要记住的是,Angular只会在触发它时触发它的手表。如果Angular世界没有发生任何事情,则不会执行任何手表或回调。由于您的刻录机位于Angular世界之外,因此需要通知Angular已经发生了某些变化。更新记录后,可以通过偶尔拨打$apply来完成。另一种可供选择的方法是使用$timeout定期更新Angular。

+0

谢谢,这个作品!也可以直接在角度外的控制器范围内调用一个函数?如果我用angular.element(e).scope()获取范围,其中e是在ng-view中加载的顶层元素,我似乎无法调用分配的控制器中的函数。 – dndr 2013-05-03 12:41:17

+0

@JoostVanDoremalen不知道,但也许['$ eval()'](http://docs.angularjs.org/api/ng.$ro​​otScope.Scope#$eval)可以帮助你。虽然适当的解决方案是将所有这些东西包装在一个[指令](http://docs.angularjs.org/guide/directive)中,但是这是一个更多的工作,特别是如果你还不习惯这样做。 – Supr 2013-05-03 12:52:38