Я думаю, вы, вероятно, сможете создать систему отмены, которая использует какую-то систему классификации для различных типов отмены наряду с подходом, более ориентированным на события. Я сосредоточился на комментариях, которые вы сделали об итерации целых объектов для каждого нажатия клавиши, поэтому начну с этого
Я предполагаю, что вы не обновляете сервер для каждого нажатия клавиши на входах, и в этом случае вам не нужно будет смотреть что-либо, кроме ключевых событий конкретного входа, пока он находится в фокусе. Когда вы привязываете CTRL + Z к документу, делайте это так, чтобы ничего глобального не происходило, когда ввод находится в фокусе.
Следующий сценарий основан на простейшем действии пользовательского интерфейса для отслеживания ... только поля обновления.
Находясь в фокусе ввода, вы немедленно берете копию текущего значения модели и сохраняете ее как значение для использования в дальнейшем для полной отмены ng-модели.
Находясь в фокусе, CTRL + Z будет привязан к этому вводу, и события нажатия клавиш могут быть отменены на очень локальном уровне, не влияя на необходимость просмотра на более высоком уровне. Отключите ключевые события для этого ввода при размытии.
При размытии ввода вы сможете $emit
update event
, который вы будете отслеживать как категорию, например «обновление поля». Отправьте старое сохраненное значение, объект, содержащий ng-model
и категорию обновления, в службу отслеживания, которая прослушивает обновления и помещает обновления в массив отмены.
Когда пользователь нажимает кнопку «Отменить», служба проверяет тип обновления и изменяет значение объекта, связанного с сохраненным именем поля, и удаляет этот последний сохраненный элемент из очереди.
Я сделал что-то подобное, используя только jQuery для пользовательского интерфейса, который был настроен как для создания макета веб-страницы с абсолютным позиционированием элементов, так и для управления им, а также для вставки и обновления содержимого.
Я только начал вводить данные на уровне пользователя, который не предполагает создания или удаления новых объектов данных. Это может быть обработано $ .watch, наблюдающим за длиной массива. Наблюдая только за длиной, вам не придется перебирать каждое свойство каждого содержащегося объекта, чтобы выяснить, что изменилось.
Одним из полезных свойств отслеживания для всего этого является свойство $$hashKey
, которое angular присваивает каждому объекту, которого он касается, во всех областях. Использование haskey может помочь сопоставить изменения длины массива, чтобы найти различия. Я еще не просмотрел весь этот раздел.
Надеюсь, вам поможет концепция отслеживания ввода, управляемая событиями. По крайней мере, на уровне пользовательского ввода это сократит значительную часть накладных расходов с помощью $ watch.
Также angular недавно добавил более мелкий слушатель $watchCollection
был добавлен в 1.2. Еще не использовал его, но, безусловно, снижает накладные расходы там, где его использование может не требовать полного наблюдения
person
charlietfl
schedule
11.11.2013