- Bir Modal açıldığında, bu Modal içindeki önceden tanımlanmış bir <input> öğesine odaklanın.
Bir yönerge tanımlayın ve öğeye ne zaman odaklanacağını bilmesi için bir özelliği / tetikleyiciyi izlemesini sağlayın:
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));
});
}
};
}]);
Plunker
Modalın oluşturulmasına zaman tanımak için $ zaman aşımı gerekli görünmektedir.
'2.' <input> öğesi her görüntülendiğinde (örneğin, bazı düğmelere tıklayarak), odağı ayarlayın.
Esasen yukarıdaki gibi bir yönerge oluşturun. Scope özelliğinin bazılarını izleyin ve gerçek olduğunda (ng-click işleyicinizde ayarlayın), yürütün element[0].focus()
. Kullanım durumunuza bağlı olarak, bunun için $ zaman aşımına ihtiyacınız olabilir veya olmayabilir:
<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;
//});
}
});
}
};
});
Plunker
Güncelleme 7/2013 : Birkaç kişinin orijinal izolat kapsam direktiflerimi kullandığını ve gömülü girdi alanlarıyla (yani moddaki bir girdi alanı) sorun yaşadığını gördüm. Yeni bir kapsamı olmayan (veya muhtemelen yeni bir çocuk kapsamı) olmayan bir direktif, ağrının bir kısmını hafifletmelidir. Bu yüzden yukarıdaki yanıtı izolat kapsamlarını kullanmamak için güncelledim. Orijinal cevap aşağıdadır:
Bir izolat kapsamı kullanarak 1. için orijinal cevap:
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();
});
}
});
}
};
});
Dalgıç .
Bir izolat kapsamı kullanarak 2. için orijinal cevap:
<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;
//});
}
});
}
};
});
Dalgıç .
Yönergede trigger / focusInput özelliğini sıfırlamamız gerektiğinden, '=' iki yönlü veri bağlama için kullanılır. İlk yönergede '@' yeterliydi. Ayrıca, @ @ kullanırken tetikleyici değerini "true" ile karşılaştırdığımızdan, @ her zaman bir dizeyle sonuçlandığını unutmayın.