4

私はAngularが初めてです。助けていただければ幸いです。私はさまざまな領域を持つアプリを作成しています。それをページと呼びましょう (実際には 1 ページのアプリですが)、当然さまざまなビューを使用し、本文、スタイル、スクリプトなどと共通のレイアウトを持っています。

アプリの 1 つのページのみでキーボード イベントをリッスンしたいという問題が発生しています。このページは対話型であり、他のページは管理用です。キーボード イベントを入力、ドキュメント、または本文にバインドできます。入力が適切ではなく、ドキュメントと本文がグローバルであり、アプリでキーを押すたびにリッスンしたくありません。

Angular でこの問題を解決するにはどうすればよいですか?

私のコードはここにあります: https://github.com/mgenev/geminiFc/blob/master/public/js/controllers/practice.js

jQuery をごまかし、特定のページのコントローラーの本体にイベントをバインドしましたが、Angular はイベントが発生したように反応しませんでした。

$('body').keydown(function(e) {
            $scope.changeIndex(e);
});

次に、 $scope.$apply(); を使用する必要があることを読みました。これは、イベントが発生する changeIndex 関数の下部で行いました。

これは実際には機能しましたが、UI を制御する別の方法であるクリック イベントを介して changeIndex を呼び出すと、

   <div class="practice-controls-bottom">
        <i ng-click="changeIndex('down');" class="icon-thumbs-down icon-4x thumbs-down"></i>
        <i ng-click="changeIndex('up');" class="icon-thumbs-up icon-4x thumbs-up pull-right"></i>
    </div>

Angular は私にエラーを与えます:

Error: $apply already in progress
    at Error (<anonymous>)
    at g (http://localhost:3000/lib/angular/angular.min.js:85:37)
    at Object.e.$apply (http://localhost:3000/lib/angular/angular.min.js:89:129)
    at Object.$scope.changeIndex (http://localhost:3000/js/controllers/practice.js:173:20)

アドバイスお待ちしております。ありがとう!

4

2 に答える 2

5

次の解決策のいずれかを試すことができます

changeindex メソッドの代わりに、keydown ハンドラーで $scope.$apply を呼び出します

$('body').keydown(function (e) {
    $scope.$apply(function () {
        $scope.changeIndex(e);
    })
});

または、 $apply を changeIndex再度呼び出す前に、コードが適用/ダイジェスト サイクル内で実行されているかどうかを確認します。

if(!$scope.$$phase){
    $scope.$apply()
}
于 2013-10-08T03:16:53.230 に答える