angularjs:将焦点设置在指令内先前隐藏的输入元素上

标签 angularjs angularjs-directive angularjs-scope

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/

相关文章:

javascript - 来自 Angular Directive(指令) 'link' 的 $rootScope.$broadcast 出现问题

AngularJs 广播重复执行太多次

javascript - 如何从AngularJS中的另一个服务方法调用工厂方法?

angularjs - "Uploader"必须是 FileUploader 的实例

javascript - 如何在 Jasmine Test 中访问指令的范围

javascript - 在 AngularJS 中将对象从指令发送到父 Controller

javascript - 使用 Angularjs 链接异步 AJAX 调用

javascript - 我可以用两个元素替换 Angular 指令吗?

angularjs - $emit 事件不适用于 ng-if

javascript - AngularJS 哲学 - Controller 作为 "windows"到服务