2017-05-02 8 views
2

ace editor을 포함하는 modal 창이 있습니다. 모달 창이 열리면 아래로 스크롤하여 ace editor 내부를 클릭하여 텍스트를 추가합니다. 그런 다음 갑자기 창은 자동으로 위로 스크롤됩니다. 다시 아래로 스크롤하고 편집기 내부를 클릭하면 스크롤이 한 번 더 올라갑니다. 마지막으로 세 번째로 편집기에 텍스트를 삽입 할 수 있습니다. 모달이 충분히 높고 에디터가 스크롤되지 않으면 보이지 않습니다.에이스 편집기를 클릭 할 때 모달 윈도우 스크롤 업 방지

왜 그렇습니까? 이 자동 스크롤 동작을 방지하려면 어떻게해야합니까? 여기

는 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

브라우저보기로 텍스트 영역을 이동. 이로 인해 오버 플로우와 관련된 모든 종류의 문제가 발생합니다 : 숨겨진 요소가 스크롤되고, 편집기가 클릭되면 점프합니다.

에이스가 화면에 텍스트 영역이 있는지 확인하기 위해 고정 된 위치를 설정하지만 위치 지정에 버그가 있음 : https://bugs.chromium.org/p/chromium/issues/detail?id=20574 : 위치를 고정으로 설정 : 절대 위치와 관련하여 절대적으로 변형 된 요소.

에이스의 상위 요소에서 변형을 제거 할 방법이없는 경우 가장 좋은 방법은 css를 추가하여 .ace_text-input을 항상 절대 위치에 배치하는 것입니다. 당신이 (크롬 58 테스트)를 이동하지 않는 것 수동으로 초점을 설정하면

는 TLDR는 페이지

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

죄송합니다. _remove가 ace_의 부모 요소에서 변환한다는 것은 무엇을 의미합니까? _ 변형이란 무엇입니까? – trex

+0

이 위치 설정은 에이스 편집기를 숨 깁니다 http://plnkr.co/edit/GF1uGhBN7DSpxSeckfRi?p=preview – trex

+0

아아, 알았어,'ace_text-input'은 에이스에 의해 자동으로 생성되는'textarea' 태그를 위해 예약 된 클래스라는 것을 이해합니다. 하지만 태그에는 이미'position : absolute'이 있습니다. 브라우저 개발자 도구를 살펴보십시오. 따라서 아무것도 바뀌지 않았습니다. – trex

0

에 다음 CSS를 추가 할 수 있습니다. 요소를 초기화 한 후 수동으로 요소에 포커스를 설정할 수 있습니다.

은 UI-ACE 옵션에 onLoad 이벤트를 추가하고 ModalInstanceCtrl이 추가 : 문제는 에이스를하지 않고 내가 같은 문제가 있기 때문에 부트 스트랩 모달보다는 에이스 편집기에서 존재하는 것 같다

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

에이스 편집기가 숨겨져 있습니다. – trex