gpt4 book ai didi

angularjs - Angular 标签 - 可排序/可移动

转载 作者:行者123 更新时间:2023-12-04 16:29:05 26 4
gpt4 key购买 nike

是否有任何允许重新排序它们的 Angular JS 选项卡指令(如浏览器的选项卡)

如果不是开始实现会很棒

使用 angular-ui-bootstap

<tabset> 
<tab ng-repeat="tab in vm.tabs" active="tab.active" sortable-tab> </tab>
<tab disabled="true" ng-click"vm.addNewTab()" class="nonSortable-addTab-plusButton"></tab>
</tabset>

如何使它们可重新排序?

编辑:添加赏金以使用上面的原始 tabset 语法。

最佳答案

使用 Angular UI bootstrap tabset ,只需一个 sortable-tab指示:

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

首先,它需要一些技巧/技巧才能与 ngRepeat 集成。 ,因此它可以重新排序数组。它(重新)解析 ng-repeat属性,并从作用域中获取数组,就像 ngRepeat
// 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;
});

然后您还可以观看 $index作用域上的变量,以确保您始终拥有当前元素的最新索引:
var index = scope.$index;
scope.$watch('$index', function(newIndex) {
index = newIndex;
});

然后使用 HTML5 drag and drop ,通过 setData 传递元素的索引作为其数据和 getData
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');
},

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);
});
};
}

注意:关于使用 hover 有一点小技巧。类,而不是 :hover对于一些悬停效果。这部分是由于 CSS :hover元素从鼠标下方重新排列后,样式不会被删除,至少在 Chrome 中是这样。

实际移动选项卡的函数采用数组 ngRepeat使用并重新订购它:
function move(fromIndex, toIndex) {
// http://stackoverflow.com/a/7180095/1319998
tabs.splice(toIndex, 0, tabs.splice(fromIndex, 1)[0]);
};

你可以看到这一切 in a Plunker

关于angularjs - Angular 标签 - 可排序/可移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22850782/

26 4 0