用于按键重定向的 AngularJS 代码应该是服务或指令
AngularJS code for redirection on keypress should be a service or a directive?
当用户从键盘按下特定键时,我需要将用户重定向到特定路由。我的问题是:
根据关注点分离和 AngularJS 最佳实践,此代码应该保留在指令上还是服务上?
我知道应该使用指令来操纵 DOM。因此,考虑到这一点,我创建了以下服务:
myApp.factory("KeyPressEvents", ['$rootScope', '$document', '$location', function($rootScope, $document, $location){
return $document.bind("keypress", function(event){
if(event.charCode==112){
$rootScope.$apply(function(){
$location.path('/route2');
});
}
});
}]);
在上面的代码中,每当用户按键盘上的 P 时,他都会被重定向到"/route2"。
另一方面,在研究stackoverflow时,我意识到一些答案建议使用指令做几乎相同的事情:
如何在 AngularJS 中使用按键事件?
在 AngularJS 中绑定键盘事件
这就是为什么我仍然不太明白的原因。对这个问题有什么想法吗?谢谢!
IMO,指令不仅限于DOM操作,而且也适用于UI交互。我做了类似的事情来注册一个扫描仪(就我的应用程序而言,它只是"键入"几个字符,后跟一个产品代码)。我将指令贴在 html
标签上(请记住,ng-app
也需要在 html 标签上才能正常工作)。虽然你也可以把指令放在文本输入上 - 在我的情况下,它需要在正文上。
<html ng-app="myApp" scanner>
本质上,该指令侦听插入符号字符,如果检测到它,它将使用该ScannerService
然后相应地执行重定向。
myApp.directive('scanner', ["$state", "ScannerService", function ($state, ScannerService){
return {
restrict: 'A',
link: function (scope, elem) {
elem.bind('keypress', function (e) {
if (e.which === 94) { // ^
barcodeListen = true;
}
if (barcodeListen === true) {
if (e.which === 13) { // new-line
ScannerService.processBarcode(barcodeText);
barcodeListen = false;
}
e.preventDefault(); // don't print character
}
});
}
};
}]);
由于我希望快捷方式是应用程序范围的,因此我将代码插入到app.run中,如@DanielWeiner的注释所示。所以,我最终得到了这个:
app.run(['$rootScope', '$document', '$location',
function($rootScope, $document, $location){
$document.bind("keypress", function(event) {
if($('input:focus').length == 0) {
// If we press the 'j' key, goes to /route2
if(event.charCode==112){
$rootScope.$apply(function(){
$location.path('/route2');
});
}
}
});
}
]);
感谢您的回答和评论。
相关文章:
- 如何根据服务更改更新指令
- AngularJs在调用服务方法后更新指令
- angular应用程序中的浏览器功能检测:使用服务、指令、控制器
- AngularJs 在指令中操作来自服务响应的数据
- 如何从指令的控制器调用依赖注入服务的嵌套方法
- Angularjs指令未从服务更新
- 若在同一文件中,则指令的Angularjs服务是未知的
- 如何将服务注入链接函数包含指令
- 在 angular2 指令中注入 angular1 服务
- 如何将指令模型绑定到异步服务数据
- 用于按键重定向的 AngularJS 代码应该是服务或指令
- 使用 Restangular 保持 CRUD 干燥:指令、继承控制器或包装服务
- 从服务 AngularJS + TypeScript 调用指令
- 将服务注入指令 AngularJS 和数据绑定
- 服务和指令之间的通信:依赖关系或或事件
- AngularJS:如何从服务向 dom 添加和编译指令
- 我们可以移除/删除控制器、服务、工厂、指令等吗?
- 从使用它的指令更新服务
- AngularJS-通过服务从指令更新控制器数据(this.model语法)
- 试图处理外部服务/指令,得到未捕获的对象