【问题标题】:Is it possible to move/sort/reorder Angular UI Tabs with drag and drop?是否可以通过拖放移动/排序/重新排序 Angular UI 选项卡?
【发布时间】:2017-04-06 19:04:46
【问题描述】:

以前版本的 Angular UI 似乎可行(请参阅 here),但我尝试使用 uib-tabset,但它不起作用。有什么想法吗?

这不起作用:

 <uib-tabset sortable-tab>
    <uib-tab heading="Title 1">
      Some text 1
    </uib-tab>
    <uib-tab heading="Title 2">
      Some text 2
    </uib-tab>
 </uib-tabset>

PLUNK

【问题讨论】:

    标签: angularjs angular-ui-bootstrap angular-ui


    【解决方案1】:

    它仍然有效。您必须应用该指令。您的示例中的指令尚未内置到 ui 中。这是一个Plunker,它适用于新版本。

    在您的 HTML 中:

        <uib-tabset>
     <uib-tab sortable-tab ng-repeat="tab in data.tabs" heading="{{tab.title}}" active="tab.active" disabled="tab.disabled">
            <p>{{tab.content}}</p>
          </uib-tab>
          <uib-tab disabled="true">
            <uib-tab-heading>
              <i class="glyphicon glyphicon-plus"></i>
            </uib-tab-heading>
          </uib-tab>
             </uib-tabset>
    

    您还必须在控制器中包含该指令:

       app.directive('sortableTab', function($timeout, $document) {
      return {
        link: function(scope, element, attrs, controller) {
          // Attempt to integrate with ngRepeat
          // https://github.com/angular/angular.js/blob/master/src/ng/directive/ngRepeat.js#L211
          var match = attrs.ngRepeat.match(/^\s*([\s\S]+?)\s+in\s+([\s\S]+?)(?:\s+track\s+by\s+([\s\S]+?))?\s*$/);
          var tabs;
          scope.$watch(match[2], function(newTabs) {
            tabs = newTabs;
          });
    
          var index = scope.$index;
          scope.$watch('$index', function(newIndex) {
            index = newIndex;
          });
    
          attrs.$set('draggable', true);
    
          // Wrapped in $apply so Angular reacts to changes
          var wrappedListeners = {
            // On item being dragged
            dragstart: function(e) {
              e.dataTransfer.effectAllowed = 'move';
              e.dataTransfer.dropEffect = 'move';
              e.dataTransfer.setData('application/json', index);
              element.addClass('dragging');
            },
            dragend: function(e) {
              //e.stopPropagation();
              element.removeClass('dragging');
            },
    
            // On item being dragged over / dropped onto
            dragenter: function(e) {
            },
            dragleave: function(e) {
              element.removeClass('hover');
            },
            drop: function(e) {
              e.preventDefault();
              e.stopPropagation();
              var sourceIndex = e.dataTransfer.getData('application/json');
              move(sourceIndex, index);
              element.removeClass('hover');
            }
          };
    
          // For performance purposes, do not
          // call $apply for these
          var unwrappedListeners = {
            dragover: function(e) {
              e.preventDefault();
              element.addClass('hover');
            },
            /* Use .hover instead of :hover. :hover doesn't play well with 
               moving DOM from under mouse when hovered */
            mouseenter: function() {
              element.addClass('hover');
            },
            mouseleave: function() {
              element.removeClass('hover');
            }
          };
    
          angular.forEach(wrappedListeners, function(listener, event) {
            element.on(event, wrap(listener));
          });
    
          angular.forEach(unwrappedListeners, function(listener, event) {
            element.on(event, listener);
          });
    
          function wrap(fn) {
            return function(e) {
              scope.$apply(function() {
                fn(e);
              });
            };
          }
    
          function move(fromIndex, toIndex) {
            // http://stackoverflow.com/a/7180095/1319998
            tabs.splice(toIndex, 0, tabs.splice(fromIndex, 1)[0]);
          };
    
        }
    
    
         }
    
        });
    

    该指令还使用ng-repeat 作为动态标签:

          $scope.data = [];
      $scope.data.tabs = [
        { title:'Dynamic Title 1', content:'Dynamic content 1', active:true},
        { title:'Dynamic Title 2', content:'Dynamic content 2'},
        { title:'Dynamic Title 3', content:'Dynamic content 3'}
      ];
    

    【讨论】:

    • 谢谢,我必须添加 a { -webkit-user-drag: none; -khtml-user-drag: none; -moz-user-drag: none; -o-user-drag: none; user-drag: none; } 以消除拖动时的 Chrome 重影
    • 顺便说一句,在 IE11 中这个解决方案不起作用,我得到 Invalid argument at wrappedListeners.dragstart (http://run.plnkr.co/hZc8Q0m06AIH504v/example.js:36:11) 谁维护了这个指令?
    • 我不确定是否有人“维护”它,但作者可能会进行一些研究。
    • 如果你得到“e.dataTransfer undefined”,只需添加“e.dataTransfer = e.originalEvent.dataTransfer;”在使用“e.dataTransfer”之前。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-05
    • 2014-02-12
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多