Сортируемые вкладки на основе условия Angularjs

Я работаю над вкладками в настоящее время. Мой сценарий - у меня есть вкладки, которые динамически добавляются и удаляются. На вкладках я применил директиву для перетаскивания. При нажатии на вкладку открывается текстовое поле внутри вкладки, и я могу редактировать имя вкладки. Я не хочу, чтобы вкладки перетаскивали / отбрасывали / сортировали при открытии ввода. Для этого я поддерживаю переменную IsEditable. Ниже приведен код директивы, которую я использовал из другого ответа. Хотя это работает, что он не падает, но показывает эффект движения при перетаскивании. Любая помощь будет оценена

productCatalogApp.directive('sortableTab', function ( $timeout, $document) {
    var tabs;

    return {
        require: "^ngController",
        link: function (scope, element, attrs, ngCtrl) {

            // 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 IsEditable = scope.isEditableTab;
            scope.$watch(match[2], function (newTabs) {
                tabs = newTabs;
            });

            scope.$watch('isEditableTab', function (newisEditableTab) {
                IsEditable = newisEditableTab;
                if (!IsEditable) {
                    attrs.$set('draggable', true);
                }
                else {
                    attrs.$set('draggable', false);
                }
            });
            var index = scope.$index;


            scope.$watch('$index', function (newIndex) {
                index = newIndex;
            });



            // Wrapped in $apply so Angular reacts to changes
            var wrappedListeners = {
                // On item being dragged
                dragstart: function (e) {

                    if (!IsEditable) {
                        e = e.originalEvent;
                        e.dataTransfer.effectAllowed = 'move';
                        e.dataTransfer.dropEffect = 'move';
                        e.dataTransfer.setData('application/json', index);
                        element.addClass('dragging');
                    }

                },
                dragend: function (e) {
                    if (!IsEditable) {
                        //e.stopPropagation();
                        e = e.originalEvent;
                        element.removeClass('dragging');
                    }
                },

                // On item being dragged over / dropped onto

                dragleave: function (e) {
                    if (!IsEditable) {
                        element.removeClass('hover');
                    }
                },
                drop: function (e, ui, scope) {
                    if (!IsEditable) {
                        e = e.originalEvent;
                        e.preventDefault();
                        e.stopPropagation();
                        var sourceIndex = e.dataTransfer.getData('application/json');
                        move(sourceIndex, index);

                        element.removeClass('hover');
                        ngCtrl.OnSort(index);
                    }

                }
            };

            // For performance purposes, do not
            // call $apply for these
            var unwrappedListeners = {
                dragover: function (e) {
                    if (!IsEditable) {
                        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 () {
                    if (!IsEditable) {
                        element.addClass('hover');
                    }
                },
                mouseleave: function () {
                    if (!IsEditable) {
                        element.removeClass('hover');
                    }
                }
            };
            if (!IsEditable) {
                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 () {
                        if (!IsEditable) {
                            fn(e);
                        }

                    });
                };
            }

            function move(fromIndex, toIndex) {
                // http://stackru.com/a/7180095/1319998
                tabs.splice(toIndex, 0, tabs.splice(fromIndex, 1)[0]);

            }
        }
    }
});

0 ответов

Другие вопросы по тегам