ここで概説した$broadcast パターンをコントローラーに使用して、サービスの状態をリッスンします。
たとえば、ここではサービスのビジー/アンビジー状態をリッスンして、マウス カーソルを設定します。
//Our service
function startRunning(){
$rootScope.$broadcast("busy");
}
function stopRunning(){
$rootScope.$broadcast("unbusy");
}
//Our controller
$scope.$on("busy", function(){
$scope.state = "busy";
});
$scope.$on("unbusy", function(){
$scope.state = "ready"
});
HTML
<div ng-controller = "myctrl" ng-state = "state"/>
CSS:
.busy{
cursor: wait;
}
.ready {
cursor:auto;
}
これの問題は、カーソルがすぐに変化しないことです。通常、マウスを動かす必要があり$digest
ます。カーソルが変化する前に、サイクルをトリガーすると思います。
私はそれを修正することができます
$scope.$apply($scope.state = "ready");
しかし、これはスローされます:
Error: [$rootScope:inprog] $digest already in progress
エラー。
これに対処する最善の方法は何ですか?
編集: これは動作中の JSFiddle です: http://jsfiddle.net/HB7LU/23512/
この問題は、Angular 以外のタイムアウト/非同期メソッドの使用に関係しているようです。(つまり、 を使用すると問題は発生しませんが、 ;$timeout
を使用すると発生します。setTimeout