Here is a simplified plunk to illustrate the problem
我有一个角度指令,在可视化之前编译一些HTML代码.在html中,只有在scope.isEditShown为true时,才会显示一个隐藏输入:
< input ng-show ='isEditShown'type ='text'value ='{{content.name}}'class ='title_edit'/>
当调用scope.titleChange函数时,将显示该输入.此函数(绑定到ng-dblclick指令)只将true设置为scope.isEditShown,并尝试在输入元素上调用jQuery的focus()方法(以前存储在使用scope.input = $(“input)的链接器函数的作用域中:文字“,ae);:
scope.isEditShown = true; scope.input.focus();
简而言之,我想在双击事件时可视化以前隐藏的输入,并立即给予关注.需要立即关注,因为输入在丢失焦点时被隐藏(我希望用户立即能够编辑输入内容,当用户点击时,输入被隐藏).
问题在于,我似乎无法以编程方式给予输入元素的重点.
经过实验,我发现当scope.isEditShown = true;被执行,输入不可见(=角度js不显示在DOM中),并使用scope.input.focus()设置焦点;一个隐藏的输入什么都不做.当输入元素最终显示出来时,它就没有集中.
什么是有角度的方式来做我想要的?什么时候可以确定我的输入显示,什么时候可以有效地调用focus()?注意:如果我在使用范围$apply()之前给出焦点的输入,我将获得$apply已经在进行中的异常.如果我做一个安全的申请,foucus不会被给予.见the plunkr.
(ps:我真的想明白,所以我不会使用自动对我做的配对libreries)
当您对某些数据绑定变量进行更改时,您需要等待相应的渲染发生,您需要使用着名的setTimeout 0(或者以$timeout服务方式).
这是一个plunkr,显示如何做到这一点.