2017-05-02 36 views
2

我有一個modal窗口,其中包含ace editor。當模式窗口打開時,向下滾動並單擊ace editor以添加一些文本。然後突然窗口自動滾動。再次向下滾動,在編輯器內部單擊並再次滾動。最後,第三次,我可以在編輯器中插入文本。當模態足夠高並且編輯器不可見時纔會發生,除非您向下滾動。當我點擊進入ace編輯器時,防止模式窗口滾動。

爲什麼?如何防止這種自動滾動行爲?

這裏是plunker:http://plnkr.co/edit/NHHkUtrw8SIDIzViNiqw?p=preview

控制器:

angular.module('ui.bootstrap.demo', ['ui.bootstrap', 'ui.ace']); 
angular.module('ui.bootstrap.demo').controller('ModalDemoCtrl', function ($scope, $modal, $log) { 

    $scope.items = ['item1', 'item2', 'item3']; 

    $scope.open = function (size) { 

    var modalInstance = $modal.open({ 
     templateUrl: 'myModalContent.html', 
     controller: 'ModalInstanceCtrl', 
     size: size, 
     resolve: { 
     items: function() { 
      return $scope.items; 
     } 
     } 
    }); 

    modalInstance.result.then(function (selectedItem) { 
     $scope.selected = selectedItem; 
    }, function() { 
     $log.info('Modal dismissed at: ' + new Date()); 
    }); 
    }; 
}); 

// Please note that $modalInstance represents a modal window (instance) dependency. 
// It is not the same as the $modal service used above. 

angular.module('ui.bootstrap.demo').controller('ModalInstanceCtrl', function ($scope, $modalInstance, items) { 

    $scope.items = items; 
    $scope.selected = { 
    item: $scope.items[0] 
    }; 

    $scope.editor = { 
    text: 'Hello, how are you getting on?' 
    }; 

    $scope.aceOptions = function (mode) { 
    return { 
     mode: mode, 
     onLoad: function (_ace) { 
     // HACK to have the ace instance in the scope... 
     $scope.modeChanged = function() { 
      _ace.getSession().setMode("ace/mode/" + mode); 
     }; 
     } 
    }; 
    }; 

    $scope.ok = function() { 
    $modalInstance.close($scope.selected.item); 
    }; 

    $scope.cancel = function() { 
    $modalInstance.dismiss('cancel'); 
    }; 
}); 

HTML:

<!doctype html> 
<html ng-app="ui.bootstrap.demo"> 
    <head> 
    <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.16/angular.js"></script> 
    <script src="//angular-ui.github.io/bootstrap/ui-bootstrap-tpls-0.12.0.js"></script> 
    <script src="//rawgit.com/ajaxorg/ace-builds/v1.2.6/src-min-noconflict/ace.js"></script> 
    <script src="//rawgithub.com/ajaxorg/ace-builds/master/src-min-noconflict/mode-css.js"></script> 
    <script src="//rawgithub.com/angular-ui/ui-ace/bower/ui-ace.min.js"></script> 
    <script src="example.js"></script> 
    <link href="//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css" rel="stylesheet"> 
    </head> 
    <body> 

<div ng-controller="ModalDemoCtrl"> 
    <script type="text/ng-template" id="myModalContent.html"> 
     <div class="modal-header"> 
      <h3 class="modal-title">I'm a modal!</h3> 
     </div> 
     <div class="modal-body"> 
      <ul> 
       <li ng-repeat="item in items"> 
        <a ng-click="selected.item = item">{{ item }}</a> 
       </li> 
      </ul> 
      Selected: <b>{{ selected.item }}</b> 
      <p> 
      Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur? 
      </p> 
      <p>Editor:</p> 
      <div ui-ace="{ 
       useWrapMode : true, 
       showGutter: true, 
       theme:'twilight', 
       mode: 'markdown', 
       rendererOptions: { 
       maxLines: 5, 
       minLines: 3 
       } 
      }" ng-model="editor.text"></div> 

     </div> 
     <div class="modal-footer"> 
      <button class="btn btn-primary" ng-click="ok()">OK</button> 
      <button class="btn btn-warning" ng-click="cancel()">Cancel</button> 
     </div> 
    </script> 

    <button class="btn btn-default" ng-click="open()">Open me!</button> 
    <button class="btn btn-default" ng-click="open('lg')">Large modal</button> 
    <button class="btn btn-default" ng-click="open('sm')">Small modal</button> 
    <div ng-show="selected">Selection from a modal: {{ selected }}</div> 
</div> 
    </body> 
</html> 
+1

這個問題似乎在引導模式,而不是王牌編輯器存在,因爲我有同樣的問題,而不必王牌。見https://github.com/abbr/ShowPreper/issues/8。 – abbr

回答

1

瀏覽器滾動文本區域到視圖時,它被聚焦。這會導致所有類型的溢出問題:隱藏的元素滾動,單擊時編輯器跳轉。

Ace試圖通過設置固定位置來確保textarea在屏幕上,但在位置規範中存在一個錯誤:fixed,https://bugs.chromium.org/p/chromium/issues/detail?id=20574這使位置:固定工作像position:absolute關於轉化的元素。

如果您沒有辦法從ace的父元素中移除變換,最好的解決方法是添加css使.ace_text輸入始終絕對定位。

TLDR添加以下CSS的網頁

.ace_text-input { 
    position: absolute!important; 
} 
+0

對不起,您是從ace_的父元素的_remove變換意味着什麼?什麼是_transform_? – trex

+0

這個位置設置隱藏ace編輯器http://plnkr.co/edit/GF1uGhBN7DSpxSeckfRi?p=preview – trex

+0

啊,好的,我明白'ace_text-input'是'acetarea'標記的保留類,它是由ace自動創建的。但是標籤已經具有'position:absolute',請查看您的瀏覽器開發人員工具。因此,沒有任何改變。 – trex

0

如果您設置的手動對焦似乎不跳(在Chrome 58測試)。初始化後,您可以手動設置元素的焦點。

onLoad事件添加到ui-ACE選項,然後添加這個到ModalInstanceCtrl

$scope.focusEditor = function(editor) { 
    editor.focus(); 
} 
+0

這隱藏了ace編輯器。 – trex

相關問題