2013-05-03 54 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