AngularJS - Фокусировка входного элемента при нажатии флажка
Есть ли более чистый способ делегирования фокуса элементу при щелчке по флажку. Вот грязная версия, которую я взломал:
HTML
<div ng-controller="MyCtrl">
<input type="checkbox" ng-change="toggled()">
<input id="name">
</div>
JavaScript
var myApp = angular.module('myApp',[]);
function MyCtrl($scope, $timeout) {
$scope.value = "Something";
$scope.toggled = function() {
console.debug('toggled');
$timeout(function() {
$('#name').focus();
}, 100);
}
}
JSFiddle: http://jsfiddle.net/U4jvE/8/
Ответы
Ответ 1
как насчет этого? plunker
$scope.$watch('isChecked', function(newV){
newV && $('#name').focus();
},true);
@asgoth и @Mark Rajcok верны. Мы должны использовать директиву. Я был ленив.
Вот директивная версия. plunker Я думаю, что одна из веских причин сделать это директивой - вы можете повторно использовать эту вещь.
поэтому в вашем html вы можете просто назначить разные модалы различным наборам
<input type="checkbox" ng-model="isCheckedN">
<input xng-focus='isCheckedN'>
directive('xngFocus', function() {
return function(scope, element, attrs) {
scope.$watch(attrs.xngFocus,
function (newValue) {
newValue && element.focus();
},true);
};
});
Ответ 2
Другая директивная реализация (которая не требует jQuery) и заимствует некоторый код @maxisam:
myApp.directive('focus', function() {
return function(scope, element) {
scope.$watch('focusCheckbox',
function (newValue) {
newValue && element[0].focus()
})
}
});
HTML:
<input type="checkbox" ng-model="focusCheckbox">
<input ng-model="name" focus>
Fiddle.
Так как эта директива не создает область изоляции (или дочернюю область), директива предполагает, что область действия имеет свойство focusCheckbox
.
Ответ 3
Если вы хотите сделать его более интересным и поддерживать любое выражение для оценки (а не только переменные), вы можете сделать это:
app.directive('autofocusWhen', function ($timeout) {
return {
link: function(scope, element, attrs) {
scope.$watch(attrs.autofocusWhen, function(newValue){
if ( newValue ) {
$timeout(function(){
element.focus();
});
}
});
}
};
});
И ваш html может быть немного более развязан, например:
<input type="checkbox" ng-model="product.selected" />
{{product.description}}
<input type="text" autofocus-when="product.selected" />
Ответ 4
Более чистый способ - использовать директиву для переключения:
app.directive('toggle', function() {
return {
restrict: 'A',
scope: {
selector: '='
},
link: function(scope, element, attrs) {
element.on('change', function() {
$(scope.selector).focus();
scope.$apply();
});
}
}:
});
Ваш html будет выглядеть следующим образом:
<input type='checkbox' toggle selector='#name'>