为什么在AngularJS中,不能在Twitter Bootstrap模态框(弹出框)内设置文本框的焦点?
为什么在AngularJS中,不能在Twitter Bootstrap模态框(弹出框)内设置文本框的焦点?
我一直在尝试实现这里和其他类似的解决方案:如何设置输入框的焦点?我的代码与不起作用的自动聚焦一起PLUNKER。
HTML
问题出现的原因是因为在Twitter Bootstrap的弹出框(modal)中,使用AngularJS时无法设置文本框(textbox)获得焦点。为了解决这个问题,作者参考了一个自定义弹出框的教程,并使用了一个简单的指令(directive),通过设置焦点来实现默认聚焦到“确定”按钮上。
解决方法是创建一个名为“focusMe”的指令,在link函数中监听指令绑定的变量(attrs.focusMe),当变量的值发生变化时,使用$timeout函数来延迟20毫秒后调用element[0].focus()方法来设置焦点。
还有在注释部分可以使用$compile选项来自定义元素的内部HTML。
下面是整理后的文章:
我使用了以下链接Building dialog service using bootstrap modal来自定义我的警告框和确认框。在这里,我遇到了一个需要默认聚焦到“确定”按钮上的情况。所以我使用了下面这个简单的指令,而且它对我来说非常好用,希望对其他人也有所帮助。
myApp.directive('focusMe', function($timeout, $compile) { return { link: function (scope, element, attrs) { scope.$watch(attrs.focusMe, function(val) { // element.html(anyHtmlHere); // $compile(element.contents())(scope); $timeout(function() { element[0].focus(); }, 20); }); } }; });
在这里,你可以使用注释部分的$compile选项来自定义元素的内部HTML。
问题的原因是,focusMe指令在ng-model中使用时需要进行一些修改。该指令定义了一个独立的作用域,因此ngModel无法向上传递到父级控制器作用域中。
解决方法是重新定义指令,不使用单独的作用域,并通过链接函数的attrs对象获取focusMe属性的值。
代码如下:
app.directive('_focusMe', function($timeout) { return function(scope, element, attrs) { scope.$watch(attrs.focusMe, function(value) { if(value) { $timeout(function() { element.focus(); }, 20); } }); }; });
另外,还可以参考stackoverflow上的相关解决方案:stackoverflow.com/questions/14859266/…
然而,当文本框位于模态框(弹出窗口)中时,自动聚焦功能不起作用。你可以在这里查看将模态框与代码一起使用的效果:plnkr.co/WKq83K。如果我遗漏了什么,请告诉我。