Переопределить $ digest и $ watch в Angular JS

Может ли кто-нибудь подсказать, как мне создать службу, чтобы обойти angular js default $ watch и $ digest loop?

Мое требование - $ смотреть объект области с помощью слушателя, а функция слушателя должна иметь 4 параметра, @ param1 - newObject, @ param2 - oldObject, @ param3 - точный атрибут, который изменился, @ param4 - иерархия атрибута в этом объекте. к тому атрибуту, который изменился.

требуется :-

$scope.$watch('objectName', function(param1,param2,param3,param4){
   //log param3 and param4 in a stack for later use. 
   //Note:- I dont want to log entire changed object since its too big.
}, true);

ПРИМЕЧАНИЕ: - Прямо сейчас мы можем глубоко наблюдать за объектом, но слушатель предоставит нам 2 объекта, старый объект и новый объект. Все, что я хочу, - это изменить точный атрибут.

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

Отменить повторение в Angular JS


person Libu    schedule 11.11.2013    source источник
comment
Проверьте реализацию отмены / повтора в моем ответе на ваш предыдущий пост.   -  person Nikos Paraskevopoulos    schedule 11.11.2013
comment
Спасибо, Никос, это проливает свет на проблему :)   -  person Libu    schedule 13.11.2013


Ответы (1)


Я думаю, вы, вероятно, сможете создать систему отмены, которая использует какую-то систему классификации для различных типов отмены наряду с подходом, более ориентированным на события. Я сосредоточился на комментариях, которые вы сделали об итерации целых объектов для каждого нажатия клавиши, поэтому начну с этого

Я предполагаю, что вы не обновляете сервер для каждого нажатия клавиши на входах, и в этом случае вам не нужно будет смотреть что-либо, кроме ключевых событий конкретного входа, пока он находится в фокусе. Когда вы привязываете 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