Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >为什么这个指令中的所有键绑定都会被最后一个键绑定覆盖?

为什么这个指令中的所有键绑定都会被最后一个键绑定覆盖?
EN

Stack Overflow用户
提问于 2013-01-15 03:05:22
回答 1查看 736关注 0票数 0

我试图创建一个指令,将特定的按键绑定到控制器作用域中指定的函数,但所有回调函数似乎都被包含绑定的对象中的最后一个回调函数覆盖。我已经尝试使用keymaster.js和mousetrap.js来绑定具有相同结果的事件。

Code in a JSFiddle

Javascript代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
angular.module('app', ['directives', 'controllers']);

angular.module('directives', [])
.directive('keypress', [function () {
    return function (scope, element, attrs) {
        // console.log(scope, element, attrs);
        var attribute = scope.$eval(attrs.keypress || '{}');
        for (var k in attribute) {
            console.log('binding ' + k + ' as ' + attribute[k]);
            Mousetrap.bind(k, function() { return attribute[k](scope, element); });
        }
    };
}]);

angular.module('controllers', [])
.controller('TodoController', function($scope) {
    $scope.shortcuts = {
        'w': function () { console.log('w'); },
        's': function () { console.log('s'); },
        'a': function () { console.log('a'); },
        'd': function () { console.log('d'); }
    };
});

HTML文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<html>
  <head>
    <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.0.3/angular.js"></script>
    <script src="https://raw.github.com/ccampbell/mousetrap/master/mousetrap.min.js"></script>
    <script src="/javascript/app.js"></script>
  </head>
  <body>
    <div ng-app="app">
      <div ng-controller='TodoController' keypress='shortcuts'>Foo</div>
    </div>
  </body>
</html>

为什么无论我按下'w‘、'a’、's‘还是'd’,'d‘总是写入控制台?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-15 03:14:47

您落入了一个常见的陷阱: JavaScript中的变量始终是函数作用域。执行此操作时:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for (var k in attribute) {
    console.log('binding ' + k + ' as ' + attribute[k]);
    Mousetrap.bind(k, function() { return attribute[k](scope, element); });
}

有了这个bind(),您将创建四个闭包,它们都关闭在变量k-but上,它们都关闭在同一个变量上。您不会在每次循环运行时都获得一个新的。因为k的值是立即使用的,所以console.log可以很好地工作。在实际运行之前,闭包不会对k求值,到那时,它的值已经更改为循环结束时的值。

根据您的目标受众,到目前为止解决此问题的最简单方法是使用let而不是varlet确实做了块作用域(它的工作方式与您期望的差不多),但它是一个相当新的发明,我不确定它得到了多好的支持。

否则,要获得一个新的作用域,您需要一个新函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for (var k in attribute) {
    (function(k) {
        console.log('binding ' + k + ' as ' + attribute[k]);
        Mousetrap.bind(k, function() { return attribute[k](scope, element); });
    })(k);
}

这会将外部k传递给函数的内部k,它每次都是一个不同的变量。你也可以把它拆分成一个小的工厂函数,但是对于这么小的东西,我不会费心的。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14330527

复制
相关文章
vscode 快捷键绑定
最近迷上了vscode,用它开发.netcore程序十分方便,智能提示也很好用,插入智能提示的选项是enter键或者tab键,可惜我以前习惯使用vs写c#,习惯用空格做智能提示的选择,多方查找资料甚至准备采用开发一个vscode插件的方式解决,后来无意间查看官方文档,利用vscode的快捷键绑定功能是可以做到的。
全栈程序员站长
2022/08/30
3190
Sublime Text 中的SublimeREPL的绑定快捷键配置
因为在配置python的Sublime Text环境,所以以python为例说明。
望天
2018/08/02
1.2K0
分享一个好用的快捷键绑定js库
官网:http://www.openjs.com/scripts/events/keyboard_shortcuts/
前Thoughtworks-杨焱
2021/12/07
4490
Vim魔法堂:认识快捷键绑定
Brief                               习惯在VS上按<F5>来编译运行程序,刚用上VIM上就觉得无比的麻烦,而随着对VIM的学习我们分阶段的简化这一操作   1. 退出VIM,在shell下编译&&运行程序 :wq [root@fsjohnhuang ~]# gcc main.c -o main [root@fsjohnhuang ~]# ./main   2. 在VIM的命令行模式下编译&&运行程序 :!gcc % -o main :!./main   3. 快捷键绑定一
^_^肥仔John
2018/01/18
1.5K0
Vim魔法堂:认识快捷键绑定
vue双向绑定指令[通俗易懂]
v-model:双向绑定,既有数据源到页面,也有页面到数据源,在不操作DOM的前提下,快速获取表单的数据(v-bind是单向绑定,只有数据源到页面)
全栈程序员站长
2022/10/05
6450
vue双向绑定指令[通俗易懂]
vue的双向绑定原理及实现_vue双向绑定指令
以往的MVC模式是单向绑定,即Model绑定到View,当我们用JavaScript代码更新Model时,View就会自动更新
全栈程序员站长
2022/11/07
1K0
《Quickey Launcher》给常用网站绑定emoji快捷键
Quickey Launcher以优雅的方式, 为任意网页绑定一个快捷键, 绑定完成后, 即可通过快捷键,打开网页
zhaoolee
2019/03/29
7140
《Quickey Launcher》给常用网站绑定emoji快捷键
从零开始匹配vim(2)——快捷键绑定
如果说 vim有什么最吸引人,我想vim允许你自由的定义各种快捷键算是一个原因吧。你可以通过绑定各种快捷键来使经常使用的功能更加便利。通俗的讲,快捷键映射就是我按下某个键,我想让vim将它当成另一个键,例如我按下 k,我想让vim把它当做 c 来使用(当然这么映射会把人逼疯)
Masimaro
2022/08/04
8770
从零开始匹配vim(2)——快捷键绑定
Java中的静态绑定和动态绑定
一个Java程序的执行要经过编译和执行(解释)这两个步骤,同时Java又是面向对象的编程语言。当子类和父类存在同一个方法,子类重写了父类的 方法,程序在运行时调用方法是调用父类的方法还是子类的重写方法呢,这应该是我们在初学Java时遇到的问题。这里首先我们将确定这种调用何种方法实现或 者变量的操作叫做绑定。
哲洛不闹
2018/09/19
2.1K0
Java中的静态绑定和动态绑定
一个Java程序的执行要经过编译和执行(解释)这两个步骤,同时Java又是面向对象的编程语言。当子类和父类存在同一个方法,子类重写了父类的方法,程序在运行时调用方法是调用父类的方法还是子类的重写方法呢,这应该是我们在初学Java时遇到的问题。这里首先我们将确定这种调用何种方法实现或者变量的操作叫做绑定。
技术小黑屋
2018/09/05
1.8K0
Java中的静态绑定和动态绑定
一个Java程序的执行要经过编译和执行(解释)这两个步骤,同时Java又是面向对象的编程语言。当子类和父类存在同一个方法,子类重写了父类的 方法,程序在运行时调用方法是调用父类的方法还是子类的重写方法呢,这应该是我们在初学Java时遇到的问题。这里首先我们将确定这种调用何种方法实现或 者变量的操作叫做绑定。
哲洛不闹
2018/09/19
1.5K0
Java中的静态绑定与动态绑定
由上面我们可以得出结论,如果一个方法不可被继承或者继承后不可被覆盖,那么这个方法就采用的静态绑定。
俺也想起舞
2019/07/24
1.6K0
Vue 指令之v-bind指令绑定属性
指令 (Directives) 是带有 v- 前缀的特殊属性,Mustache语法不能作用在HTML属性上,遇到这种情况应该使用v-bind指令。v-bind 指令可简写为 : 1. v-bind 绑定属性 ---- <div id="app"> <p v-bind:class="art">标签内容</p> </div> <script> let vm = new Vue({ el: '#app', data: { art: 'active' } }) </script> 最终生成的p标签 <
很酷的站长
2023/02/18
3880
Vue 指令之v-bind指令绑定属性
交换机间路由、绑定多个路由键,匿名队列等
原来交换机和交换机之间也能绑定,路由消息.... 绑定多个路由键,需要反复调用queueDeclare,但是却不会被识别为变更queue配置,也不会触发异常(在通常情况下,一个队列/交换机在定义之后,如果有配置变更也不允许修改其配置,必须删除后重新建)。 匿名队列,独占队列,自动删除 独占exclusive队列,只允许创建该队列的connection和channel连接,在channel和connection断开连接之后,独占队列将自动删除,队列内的消息也会丢失。 # 演示目标: target e-pr
喜欢天文的pony站长
2021/12/06
4170
交换机间路由、绑定多个路由键,匿名队列等
WPF ComboBox 使用 ResourceBinding 动态绑定资源键并支持语言切换
WPF ComboBox 使用 ResourceBinding 动态绑定资源键并支持语言切换
独立观察员
2022/12/06
2K0
WPF ComboBox 使用 ResourceBinding 动态绑定资源键并支持语言切换
React组件方法中为什么要绑定this
上例仅仅是一个组件类的定义,当在其他组件中调用或是使用ReactDOM.render( )方法将其渲染到界面上时会生成一个组件的实例,因为组件是可以复用的,面向对象的编程方式非常适合它的定位。根据this指向的基本规则就可以知道,这里的this最终会指向组件的实例。
大史不说话
2019/03/01
8670
Angularjs进阶笔记(2)-自定义指令中的数据绑定
自定义指令,是Angularjs用来实现组件化的方式,相比于React和Vue的组件化方式,它真的很复杂,自定义指令太重了,它暴露了太多可供定制的参数,以至于普通的开发者完全不知道要用它来做什么而将其束之高阁,毕竟一般的业务逻辑通过controller和service就已经可以完成了。
大史不说话
2019/03/01
2.1K0
这个网站,可以一键爬取网页上的所有图片!
今天给大家推荐一个网站,可以一键下载分析和获取网页上的所有图片,并且可以一键打包下载!
崔庆才
2023/01/04
4.5K0
这个网站,可以一键爬取网页上的所有图片!
react中的事件绑定
React中的事件绑定是将事件处理函数与组件的交互操作关联起来的过程。通过事件绑定,我们可以在React组件中响应用户的交互,并进行相应的操作。
堕落飞鸟
2023/05/19
3.1K0
点击加载更多

相似问题

用Visual键绑定覆盖单个Resharper键绑定

21

用于覆盖现有键绑定的自定义键绑定

20

绑定键绑定键的键属性

20

覆盖(全局覆盖emacs中的键绑定)

12

全局覆盖Emacs中的键绑定

90
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文