- Коли Модал відкрито, встановіть фокус на заздалегідь визначений <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> стає видимим (наприклад, натиснувши якусь кнопку), встановіть фокус на ньому.
Створіть директиву по суті, як описана вище. Перегляньте деяку властивість області, і коли вона стане істинною (встановіть її в обробці ng-click), виконайте виконання element[0].focus()
. Залежно від випадку використання, для цього ви можете або не знадобитися $-тайм-аут:
<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;
//});
}
});
}
};
});
Плункер
Оновлення 7/2013 : Я бачив, як декілька людей використовують мої оригінальні директиви щодо ізоляції області, а потім виникають проблеми із вбудованими полями введення (тобто полем введення в модальному режимі). Директива, яка не має нової сфери застосування (або, можливо, нової сфери застосування дитини), повинна полегшити частину болю. Отже вище я оновив відповідь, щоб не використовувати ізоляційні області. Нижче оригінальна відповідь:
Оригінальна відповідь для 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;
//});
}
});
}
};
});
Плункер .
Оскільки нам потрібно скинути властивість тригер / focusInput у директиві, '=' використовується для двостороннього прив’язки даних. У першій директиві "@" було достатньо. Також зауважте, що при використанні "@" ми порівнюємо значення тригера з "true", оскільки @ завжди призводить до рядка.