嗨,我有一个指令,聚焦输入模式。当它是一个单一的模式时,焦点就会很好地工作。但是在一个例子中,我有一个模态,然后单击这个模式上的一个按钮,在顶部触发另一个模式。这样重点就不起作用了。
有什么想法吗?
这是我的密码:
.directive('auto-focus', function ($timeout) {
return {
restrict: 'A',
link: function(scope, el) {
var whiteList = ['input', 'a', 'textarea', 'div']
, tagToFocus = el[0].tagName.toLowerCase()
, allow = whiteList.indexOf(tagToFocus) > -1;
if (!allow) {
throw new Error(`Autofocus is not allowed on ` + tagToFocus);
}
$timeout(() => el[0].focus(), 50);
}
}
发布于 2015-10-24 22:46:11
我认为你的指示是可以的,问题可能是你打开模式的方式。
我想第二种模式的用法已经是rendered html
了。假设您在页面中的某个地方有隐藏的html模板。如果您的第二个模式使用隐藏的html模板,那么focus
将无法工作!您可以通过console.log
元素来检查这一点。
如果你的第二个模态使用你的第一个模态html的任何部分,它也不会工作!
因此,这将只适用于新注入的html,或者您必须重新运行您的指令后,模态打开。
请查看此演示以获得进一步的澄清。
发布于 2015-10-22 03:05:50
我假设发生了什么,指令auto-focus
在两个弹出窗口中。这意味着这两个指令都在争夺焦点,稍后执行的指令将获胜。这是我的猜测。
因此,我会尝试延迟稍后弹出窗口的focus()
。
可以使用可选的auto-focus
参数添加参数化您的timeout
指令。如果没有提供,它将默认为50 If。如果提供,则将使用自定义值。
然后,第二个弹出窗口中的html将如下所示:
<div> ....
<input auto-focus timeout="250"/>
</div>
像这样更新您的指令
//just a draft :)
....
restrict: 'A',
scope: {
timeout: '=' //This will create new isolate scope
}
link: function(scope, el) {
if (scope.timeout == undefined) {
//set default value
scope.timeout = 50;
}
else {
scope.timeout = parseInt(scope.timeout, 10);
....
}
https://stackoverflow.com/questions/33278767
复制相似问题