Here is a simplified plunk to illustrate the problem
我得到了一个 Angular 指令,它在可视化之前编译了一些 html 代码。在 html 中,有一个隐藏的输入,只有在 scope.isEditShown
时才可见。是 true
:<input ng-show='isEditShown' type='text' value='{{content.name}}' class='title_edit'/>
当 scope.titleChange
出现输入时函数被调用。这个函数(绑定(bind)到一个 ng-dblclick 指令)只是将 true 设置为 scope.isEditShown
并尝试调用 jQuery 的 focus()
输入元素上的方法(以前使用 scope.input = $("input:text", ae);
存储在链接器函数的范围中:
scope.isEditShown = true;
scope.input.focus();
简而言之,我想在双击某物时可视化先前隐藏的输入,并立即获得焦点。需要立即获得焦点,因为输入在失去焦点时被隐藏(我希望用户能够立即编辑输入内容。当用户点击离开时,输入被隐藏)。
问题是我似乎无法以编程方式将焦点放在输入元素上。
实验后发现当
scope.isEditShown = true;
执行时,输入尚不可见(= Angular js 未在 DOM 中显示),并使用 scope.input.focus();
设置焦点到隐藏的输入什么也不做。当输入元素最终显示出来时,它是没有焦点的。做我想做的事的 Angular 方式是什么?我什么时候可以确定我的输入会显示,我什么时候可以调用
focus()
有效吗?注意:如果我使用 scope.$apply()
在关注输入之前,我会得到 $apply already in progress
异常(exception)。如果我进行安全申请,将不会给予关注。见 the plunkr .(ps:我真的很想了解,所以我不会使用自动为我做的伴随库)
最佳答案
当您对某些数据绑定(bind)变量进行更改并且需要等待相应的渲染发生时,您需要使用著名的 setTimeout
0(在 Angular 中交替使用 $timeout
服务)。
这是一个 plunkr,展示了如何做到这一点。
http://plnkr.co/edit/N9P7XHzQqJbQsnqNHDLm?p=preview
关于angularjs:将焦点设置在指令内先前隐藏的输入元素上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15613773/