Я разрабатываю приложение Angular, размещенное в SharePoint 2013, и (я думаю) сталкиваюсь с проблемами с ngAria
и $ariaProvider
.
Проблема в том, что когда я щелкаю ссылку, чтобы открыть элемент <md-dialog>
в качестве модального, поток пользовательского интерфейса блокируется примерно на 30-40 секунд. Благодаря отладке я могу отследить его до одного метода, включенного в Angular Material .js, с именем walkDOM(element)
.
Приложение отлично работает локально (без SharePoint), но зависает в среде SharePoint. Я думаю, что этот метод проблематичен, потому что дерево DOM, которое он проходит в SharePoint, значительно больше, чем в разработке. После запуска модального события открытия запускается метод walkDOM()
, который добавляет значение aria-hidden="true"
к большинству элементов DOM. Из-за сложной структуры DOM в SharePoint я думаю, что это вызывает зависание. Я могу отлаживать и видеть непрерывное срабатывание точек останова. Я также вижу, что атрибуты добавляются после зависания и не присутствуют заранее.
Я хотел бы отключить этот обход, но пока не нашел приемлемого способа сделать это. Я следил за этой веткой и пришел к выводу, что, возможно, я не смогу получить доступ к интересующим меня методам: https://github.com/angular/material/issues/600. Я понимаю, что отключение Aria — плохая практика, но я просто пытаюсь предотвратить обход DOM, из-за которого поток пользовательского интерфейса блокируется на такое долгое время. Я попробовал следующий код, чтобы перезаписать/настроить компоненты Aria для приложения Angular (последний фрагмент, предложенный в этой теме: Как отключить ngAria в ngMaterial?):
angular
.module('app', ['ui.router', 'ngMaterial', 'ngAria'])
...
.config(function ($ariaProvider) {
$ariaProvider.config({
ariaValue: true,
ariaHidden: false,
tabindex: false
});
})
.decorator('$mdAria', function mdAriaDecorator($delegate) {
$delegate.expect = angular.noop;
$delegate.expectAsync = angular.noop;
$delegate.expectWithText = angular.noop;
return $delegate;
});
Есть ли способ сделать то, что я пытаюсь сделать? Я хотел бы избежать переписывания приложения, чтобы не использовать модальные окна, если это возможно. Я думал написать глобальный метод walkDOM()
, но безуспешно.
Любая помощь будет принята с благодарностью. Спасибо!
РЕДАКТИРОВАТЬ: Это проблема с тем, как атрибуты aria
добавляются в структуру DOM и как работает метод walkDOM()
. Это не имеет ничего общего с управлением состоянием маршрутизации/модели, как указано в этом вопросе: Как предотвратить перерисовку представления при изменении маршрута в AngularJS.