我用两个自定义指令做到了,如下所示:
(function(angular) {
'use strict';
/* @ngInject */
function myAutoFocus($timeout) {
return {
restrict: 'A',
link: function(scope, element) {
$timeout(function() {
element[0].focus();
}, 300);
}
};
}
function myFocusable() {
return {
restrict: 'A',
link: function(scope, element, attrs) {
var focusMethodName = attrs.myFocusable;
scope[focusMethodName] = function() {
element[0].focus();
};
}
};
}
angular
.module('myFocusUtils', [])
.directive('myAutoFocus', myAutoFocus)
.directive('myFocusable', myFocusable);
}(angular));
如果my-auto-focus
为元素添加属性,它将在 300 毫秒后获得焦点。我将值设置为 300 而不是 0,以便在设置焦点之前加载其他异步组件。
该属性my-focusable
将在当前范围内创建一个函数。此函数将在调用时将焦点设置到元素。当它在范围内创建某些内容时,请小心避免覆盖某些内容。
这样你就不需要在 Angular 的摘要循环 ( watch
) 中添加一些东西,并且可以完全在视图中完成:
<input my-focusable="focusOnInput"></input>
<button ng-click="focusOnInput()">Click to focus</button>
我创建了一个 JSFiddle 来显示myFocusable
指令:http: //jsfiddle.net/8shLj3jc/
出于某种我不知道的原因,该myAutoFocus
指令在 JSFiddle 中不起作用,但它在我的页面中起作用。