2014-06-16 34 views
1

使用带有此属性的ui-bootstrap附加到对话框上的ok/save按钮。 第一次创建对话框时,它会按照预期的方式专注于按钮。 每隔一段时间它都不起作用。为什么这只在第一次显示对话框时才起作用?

.directive('autoFocus', function($timeout) { 
    return { 
     restrict: 'AC', 
     link: function(_scope, _element) { 
      $timeout(function(){ 
       _element[0].focus(); 
      }, 0); 
     } 
    }; 
}); 

模态模板看起来是这样的(这是来自迈克尔·康罗伊的角对话框的服务):

<div class="modal" ng-enter="" id="errorModal" role="dialog" aria-Labelledby="errorModalLabel"> 
    <div class="modal-dialog"> 
    <div class="modal-content"> 
     <div class="modal-header dialog-header-error"> 
     <button type="button" class="close" ng-click="close()">&times; 
     </button> 
     <h4 class="modal-title text-danger"><span class="glyphicon glyphicon-warning-sign"></span> Error</h4> 
     </div> 
     <div class="modal-body text-danger" ng-bind-html="msg"></div> 
     <div class="modal-footer"> 
     <button type="button" class="btn btn-primary" autoFocus ng-click="close()">Close</button> 
     </div> 
    </div> 
    </div> 
</div> 

首次将重点转移到关闭按钮没有问题。之后,焦点停留在原来的位置。

我试图处理一个重复启动这个错误对话框的回车键按钮,我真的需要把焦点从对话框的下面移开。

回答

2

原来,自动对焦对指令来说是一个非常糟糕的选择。我将它重新命名为takefocus,现在它每次都可以无任何改变地工作。为什么自动对焦不起作用?打败我。有重写指令和其他标记是有角度的,但是用指令覆盖自动对焦不是。

+0

啊,对,可能与http://www.w3schools.com/tags/att_input_autofocus.asp发生冲突 – maurycy

+2

来自[docs](https://docs.angularjs.org/guide/directive): '最佳实践:为了避免与未来标准的冲突,最好在自己的指令名称前加上前缀。例如,如果您创建了指令,那么如果HTML7引入了相同的元素,则会出现问题。两个或三个字母的前缀(例如btfCarousel)运作良好。同样,不要用ng加前缀自己的指令,否则它们可能会与未来版本的Angular中包含的指令冲突。 ' – przno

1

这是因为自动对焦编译时添加的元素,一旦指令阶段和链接功能不再调用,如果你有责任像$scope.opened显示模式上的父作用域的变量,你可以在使用$守望者说变量,即如果第i从虚假变为真实集合

.directive('autoFocus', function($timeout, $watch) { 
    return { 
     restrict: 'AC', 
     link: function(_scope, _element) { 
      $watch('_scope.opened', function (newValue) { 
       if(newValue){ 
       $timeout(function(){ 
        _element[0].focus(); 
       }, 0); 
       } 
      } 
     } 
    }; 
}); 
+0

嗯,我希望这会做到这一点。但事实并非如此。行为没有变化 – boatcoder

相关问题