2017-05-02 6 views
2

ace editorを含むmodalのウィンドウがあります。モーダルウィンドウが開いたら、スクロールしてace editorの中をクリックしてテキストを追加します。そして、突然、ウィンドウが自動的にスクロールアップされます。もう一度、スクロールしてエディタ内をクリックし、もう一度スクロールします。最後に、3回目に、エディタにテキストを挿入することができました。これは、モーダルが十分に高く、エディタがスクロールしない限り表示されない場合に発生します。エースエディタをクリックするとモーダルウィンドウがスクロールしないようにします

なぜですか?どのようにこの自動スクロールの動作を防止するには?ここで

は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を常に絶対位置にすることをお勧めします。

TLDRは手動で焦点を合わせる設定した場合、(クローム58でのテストを)ジャンプしていないようですあなたのページに

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

申し訳ありませんが、ace_の親要素から_remove transformがどういう意味ですか? _transform_とは何ですか? – trex

+0

この位置の設定はエースエディタを隠しますhttp://plnkr.co/edit/GF1uGhBN7DSpxSeckfRi?p=preview – trex

+0

ああ、私は 'ace_text-input'がaceによって自動的に作成される' textarea'タグのために予約されたクラスだと思います。しかし、タグには既に 'position:absolute'があり、ブラウザの開発ツールを見てください。したがって、何も変わっていない。 – trex

0

を次のCSSを追加します。要素を初期化した後、手動で要素にフォーカスを設定できます。

は、UI-エースオプションにonLoadイベントを追加してからModalInstanceCtrlにこれを追加します。問題はエースを持たずに、私は同じ問題を持っているので、ブートストラップモーダルではなく、エース・エディタに存在しているようだ

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

これはエースエディタを非表示にします。 – trex

関連する問題