2014-06-16 63 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

相關問題