Angular: Empty Fiddle
http://angularjs.org/
HTML
<script src="http://code.angularjs.org/angular-1.0.1.js"></script>
<div ng-controller="MyCtrl">
Hello, {{name}}!
<div auto-focus="{{condition}}">
<div ng-repeat="field in fields" ng-init="condition = $last">
<input name="test" value="test" ng-disabled="field.disabled" ng-show="field.visible" />
</div>
</div>
</div>
CSS
#test {visibility: hidden}
JavaScript
var myApp = angular.module('myApp', []);
//myApp.directive('myDirective', function() {});
//myApp.factory('myService', function() {});
function MyCtrl($scope) {
$scope.name = 'Superhero';
$scope.fields = [
{
visible : true,
disabled: true,
},
{
visible : false,
disabled: false,
},
{
visible : true,
disabled: false,
}
];
}
myApp.directive('autoFocus', autoFocus);
autoFocus.$inject = ['$timeout'];
function autoFocus($timeout) {
function link($scope, $element, $attrs) {
var doms = $element[0];
if ($attrs.autoFocus) {
$scope.$watch($attrs.autoFocus, focus);
} else {
focus(true);
}
function focus(condition) {
console.log('condition', condition);
if (condition) {
$timeout(function() {
curDoms = doms.querySelectorAll('input:not(:disabled), textarea:not(:disabled)');
console.log(curDoms)
var found = null;
angular.forEach(curDoms, function(dom) {
if (!isHidden(dom) && found === null) found = dom;
});
if (found === null) return;
found.focus();
}, $scope.$eval($attrs.focusDelay) || 0);
}
}
function isHidden(el) {
var style = window.getComputedStyle(el);
if (style.visibility == 'hidden') return true;
return (el.offsetParent === null)
}
}
return {
restrict: 'A',
link: link
};
}