次のような2つのカスタムディレクティブを使用して実行しました。
(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ミリ秒後にフォーカスを受け取ります。フォーカスを設定する前に他の非同期コンポーネントをロードできるように、値を0ではなく300に設定しました。
属性my-focusable
は、現在のスコープに関数を作成します。この関数は、呼び出されたときに要素にフォーカスを設定します。スコープ内に何かが作成されるため、何かをオーバーライドしないように注意してください。
このように、Angularのダイジェストサイクル()に何かを追加する必要はなくwatch
、ビューで完全に追加できます。
<input my-focusable="focusOnInput"></input>
<button ng-click="focusOnInput()">Click to focus</button>
myFocusable
ディレクティブを表示するためにJSFiddleを作成しました:http: //jsfiddle.net/8shLj3jc/
なんらかの理由で、myAutoFocus
ディレクティブはJSFiddleでは機能しませんが、私のページでは機能します。