2013-10-08 70 views
4

我是Angular的新手,非常感謝。我正在製作一個具有不同區域的應用程序,我們稱之爲網頁(儘管它確實是一個1頁的應用程序),對此我自然使用不同的視圖,並且我有一個與正文,樣式和腳本等共同的佈局。角度按鍵事件的問題

我遇到了一個問題,我只想在應用程序的其中一個頁面中監聽鍵盤事件,而這些頁面應該是互動的,而其他的則是管理員。我可以將鍵盤事件綁定到輸入或文檔或主體。輸入不適合,我的文檔和正文是全球性的,我不想在我的應用程序中聽每一個按鍵。

我該怎麼做才能解決Angular的這個問題?

我的代碼是在這裏:https://github.com/mgenev/geminiFc/blob/master/public/js/controllers/practice.js

我被騙了與jQuery和綁定的事件,身在控制器爲特定頁面,但角度不一樣的反應事件發生。

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

然後我讀了我必須使用$ scope。$ apply();我在事件觸發的changeIndex函數底部做了這些事情。

這實際工作,但是當我打電話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> 

角給我一個錯誤:

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) 

展望一些忠告。謝謝!

回答

5

你可以嘗試以下兩種解決方案之一

調用$範圍。$適用於該keydown的處理程序,而不是changeindex方法

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

或檢查代碼是否在一個應用運行/調用$在changeIndex再次申請喜歡

if(!$scope.$$phase){ 
    $scope.$apply() 
} 
+0

感謝這個作品! – mobetta

+0

你最後的代碼塊是你檢查一個摘要循環是否運行像一個魅力。儘管小錯字:'$ scope。$ apply()' –

2

你看看在NG-按鍵,NG-KEYUP,NG-的keydown指令之前消化週期?這樣,你只能在視圖內的元素上設置指令,你必須聽按鍵。

文件:http://docs.angularjs.org/api/ng.directive:ngKeypress

編輯:添加tabindex="0"使任何元素上的關鍵事件。

這裏是一個工作演示:http://plnkr.co/edit/whXgmQU1pKjuRqvokC2Z

HTML

<div ng-keypress="changeIndex($event)" tabindex="0">Something</div> 

JS

app.controller('MyCtrl', [function($scope) { 
    $scope.changeIndex = function($event) { 
     // $event.keyCode... 
    } 
}]); 

也有在角UI http://angular-ui.github.io/ui-utils/一個指令,讓你聯想關鍵結合功能。

<div ui-keypress="{13:'changeIndex($event)'}"></div> 
+0

謝謝,我確實嘗試過,但我沒有任何運氣綁定按鍵到div,我甚至試圖強調它的重點,看它是否工作,但沒有運氣 – mobetta

+1

原因是,你必須將'tabindex =「0」'添加到div以啓用關鍵事件!它適用於任何元素。 – jpmorin

+0

我會嘗試一下,如果它可以工作,會很棒,謝謝! – mobetta