2016-12-07 9 views
0

В настоящее время я динамически создаю таблицу, в которой несколько строк динамически добавляются (подобно Excel). Table может иметь миллионы строк.Redo - Отменить функциональность с использованием угловых js для больших данных

Для функции redo/undo я использовал Angular-Chronicle. Теперь redo/undo отлично работает, когда количество строк превышает 100. Как улучшить производительность повтора/отмены, когда данные слишком велики.

Here - рабочая демонстрация.

Примечание: Разбивка страницы не подходит для моего случая. Я хочу загрузить данные на прокрутку.

Пожалуйста, предложите любой другой подходящий угловой плагин или любым другим способом для достижения функциональности повторного использования/отмены с лучшей производительностью.

+1

Из короткого взгляда на то, как работает Cronicle, кажется, что он следит за изменениями, и это то, что занимает наибольшую производительность в угловом (и часто этот код будет называться несколько раз из-за того, что он работает угловым способом). Таким образом, вы можете отойти от этого подхода и пойти на одного из вас. У меня когда-то были проблемы с фильтрами в больших списках, и я нашел лучшую производительность, выполнив фильтрацию только тогда, когда это требуется путем смены набора данных (вызванного кодом не часами). – Tobi

ответ

1

Подводя итоги, вы можете добавить управление состоянием с фабрикой Memento.

Весь код, который вам нужен, ниже, но в моем блоге есть еще немного фона: AngularJS Memento Factory.

function MementoFactory(){ 
    return function() { 
    var memento = this; 
    // Private properties 
    var subjects = arguments; // We can track multiple objects or arrays 
    var stack = []; // Each call to "save" makes a copy of every subject on the stack 
    var currentIndex = 0; // The "current" position on the stack stack 
    // Begin by saving the current state 
    save(); 
    // Public properties 
    memento.timestamp = null; // The timestamp for the current stack 
    // Public methods 
    memento.save = save; 
    memento.canUndo = canUndo; 
    memento.undo = undo; 
    memento.canRedo = canRedo; 
    memento.redo = redo; 

    function save() { 
     var snapshot = { 
     timestamp: Date.now(), // The save time 
     subjects: [], // Contains each of the subjects 
     }; 
     for (var a = 0, al = subjects.length; a < al; a++) { 
     snapshot.subjects.push(angular.copy(subjects[a])); 
     } 
     if (stack[currentIndex] && angular.equals(stack[currentIndex].subjects, snapshot.subjects)) { 
     return; // Do nothing if the new snapshot is the same as the current snapshot 
     } 
     if (canRedo()) { 
     stack = stack.slice(0, currentIndex + 1); // Since we can "redo" we must overwrite that timeline (consider Back To The Future: Part II) 
     } 
     memento.timestamp = snapshot.timestamp; // Store the time 
     stack.push(snapshot); 
     currentIndex = stack.length - 1; 
    }; 
    function canUndo() { 
     return currentIndex > 0; 
    }; 
    function undo() { 
     if (canUndo()) { 
     restoreSnapshot(-1); 
     } 
    }; 
    function canRedo() { 
     return currentIndex < stack.length - 1; 
    }; 
    function redo() { 
     if (canRedo()) { 
     restoreSnapshot(+1); 
     } 
    }; 
    function restoreSnapshot(indexDiff) { 
     currentIndex += indexDiff; 
     var snapshot = stack[currentIndex]; 
     memento.timestamp = snapshot.timestamp; // Update the timestamp 
     for (var s = 0, sl = snapshot.subjects.length; s < sl; s++) { 
     if (snapshot.subjects[s] !== subjects[s]) { 
      angular.copy(snapshot.subjects[s], subjects[s]); 
     } 
     } 
    }; 
    }; 
}; 

angular 
    .module('app') 
    .factory('Memento', MementoFactory); 

Создать новый Memento (...) объект, передавая непримитивные переменные, которые вы хотите отслеживать

ctrl.user = { name: 'David King', location: 'England' }; 
ctrl.tags = [ 'AngularJS', 'Angular', 'Firebase' ]; 
// Create a new Memento object 
var memento = new Memento(ctrl.user, ctrl.tags); 
// Expose the undo and redo methods 
ctrl.canUndo = memento.canUndo; 
ctrl.redo = memento.redo; 
ctrl.canRedo = memento.canRedo; 
ctrl.undo = memento.undo; 

Добавить отмена и повтор кнопки вашего View

<button 
    type="button" 
    ng-click="ctrl.undo()" 
    ng-disabled="!ctrl.canUndo">Undo</button> 
<button 
    type="button" 
    ng-click="ctrl.redo()" 
    ng-disabled="!ctrl.canRedo">Redo</button> 

Сохраните объект Memento, если необходимо

<input 
    type="text" 
    ng-model="ctrl.user.name" 
    ng-change="ctrl.save()"> 
<input 
    type="text" 
    ng-model="ctrl.user.location" 
    ng-change="ctrl.save()"> 

... и все!

 Смежные вопросы

  • Нет связанных вопросов^_^