- モーダルを開いたら、このモーダル内の事前定義された<input>にフォーカスを設定します。
ディレクティブを定義し、プロパティ/トリガーを$ watchして、要素にいつフォーカスするかがわかるようにします。
Name: <input type="text" focus-me="shouldBeOpen">
app.directive('focusMe', ['$timeout', '$parse', function ($timeout, $parse) {
return {
//scope: true, // optionally create a child scope
link: function (scope, element, attrs) {
var model = $parse(attrs.focusMe);
scope.$watch(model, function (value) {
console.log('value=', value);
if (value === true) {
$timeout(function () {
element[0].focus();
});
}
});
// to address @blesh's comment, set attribute value to 'false'
// on blur event:
element.bind('blur', function () {
console.log('blur');
scope.$apply(model.assign(scope, false));
});
}
};
}]);
プランカー
$ timeoutは、モーダルにレンダリングする時間を与えるために必要なようです。
「2」<input>が表示されるたびに(ボタンをクリックするなどして)、それにフォーカスを設定します。
基本的に上記のようなディレクティブを作成します。いくつかのスコーププロパティを監視し、それがtrueになったら(ng-clickハンドラーで設定)、を実行しelement[0].focus()
ます。ユースケースに応じて、これに$ timeoutが必要な場合と不要な場合があります。
<button class="btn" ng-click="showForm=true; focusInput=true">show form and
focus input</button>
<div ng-show="showForm">
<input type="text" ng-model="myInput" focus-me="focusInput"> {{ myInput }}
<button class="btn" ng-click="showForm=false">hide form</button>
</div>
app.directive('focusMe', function($timeout) {
return {
link: function(scope, element, attrs) {
scope.$watch(attrs.focusMe, function(value) {
if(value === true) {
console.log('value=',value);
//$timeout(function() {
element[0].focus();
scope[attrs.focusMe] = false;
//});
}
});
}
};
});
プランカー
2013年7月更新:元の分離スコープディレクティブを使用していて、埋め込み入力フィールド(つまり、モーダルの入力フィールド)で問題が発生する人が何人かいるのを目にしました。新しいスコープ(または、場合によっては新しい子スコープ)を持たないディレクティブは、いくつかの問題を軽減するはずです。したがって、上記で分離スコープを使用しないように回答を更新しました。以下は元の答えです:
1.の元の回答、分離スコープを使用:
Name: <input type="text" focus-me="{{shouldBeOpen}}">
app.directive('focusMe', function($timeout) {
return {
scope: { trigger: '@focusMe' },
link: function(scope, element) {
scope.$watch('trigger', function(value) {
if(value === "true") {
$timeout(function() {
element[0].focus();
});
}
});
}
};
});
プランカー。
2.の元の回答、分離スコープを使用:
<button class="btn" ng-click="showForm=true; focusInput=true">show form and
focus input</button>
<div ng-show="showForm">
<input type="text" focus-me="focusInput">
<button class="btn" ng-click="showForm=false">hide form</button>
</div>
app.directive('focusMe', function($timeout) {
return {
scope: { trigger: '=focusMe' },
link: function(scope, element) {
scope.$watch('trigger', function(value) {
if(value === true) {
//console.log('trigger',value);
//$timeout(function() {
element[0].focus();
scope.trigger = false;
//});
}
});
}
};
});
プランカー。
ディレクティブのtrigger / focusInputプロパティをリセットする必要があるため、双方向データバインディングには「=」が使用されます。最初のディレクティブでは、「@」で十分でした。また、@を使用すると、@は常に文字列になるため、トリガー値を「true」と比較します。