ngIf замедляет работу приложения

Я создал некий TabControl, в котором активирую Pages и в зависимости от PageNumber показываю таблицу (ng-repeats). Эта таблица является собственной директивой (самодельной Grid-директивой).

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

Я полагаю, это потому, что ngIf компилирует свое содержимое, хотя это и не должно быть, но я не могу понять суть этого при использовании профилировщика. Я просто вижу, что "compileNodes" вызывается очень часто.

Кто-нибудь испытывает то же самое? Есть ли идея обходного пути?

Редактировать: что также интересно, так это то, что в первый раз, когда я перехожу к tabcontroll (ссылка внутри одностраничного приложения), он работает быстрее, а в следующий раз - медленнее. Как будто что-то запоминается, хотя весь элемент управления с вкладками удаляется при переходе к другому содержимому.

Редактировать 2: я все еще пытаюсь понять это. Это может быть даже ngRepeat, поскольку я показываю свой TabControl внутри другого TabControl, который я делаю с ngRepeat. Достаточно интересно: в первый раз, когда я захожу на свою страницу, это происходит быстро, затем я перехожу на другую страницу, и когда я возвращаюсь, это происходит медленно! Сохраняет ли ngRepeat некоторые вещи в кеше?? Профиль браузера говорит мне, что в jQuery data_user -> cache есть некоторые вещи, которые не освобождаются (в Chrome до 9 МБ данных при каждом нажатии!!)


person NoRyb    schedule 25.11.2014    source источник
comment
Вы пытались использовать бэтаранг для счетчика преформ? chrome.google.com/webstore/detail/angularjs-batarang/   -  person Alex Choroshin    schedule 25.11.2014
comment
у вас есть каждая страница, загруженная в DOM, а затем удаленная с помощью ng-ifs?   -  person user2943490    schedule 25.11.2014
comment
@Alex Choroshin: Да, я использовал Batarang, но это не дает мне подсказки, почему это занимает больше времени, чем некоторые другие страницы с привязками перемещения и т. д.   -  person NoRyb    schedule 25.11.2014
comment
@ user2943490: Ну да, но я не думаю, что он загружен, или, по крайней мере, я думал, что ng-if его не загружает (а не ng-show). С другой стороны, я думаю, что он скомпилирован, как указано в документе ngIf: docs.angularjs. org/api/ng/директива/ngIf   -  person NoRyb    schedule 25.11.2014
comment
согласно документам, ng-if работает путем клонирования существующих элементов DOM и сохранения их в памяти. Даже если исходный элемент будет удален из DOM, в памяти может остаться большое количество клонов. У вас очень большое количество узлов DOM?   -  person user2943490    schedule 25.11.2014
comment
@ user2943490: да, но поскольку мой ngRepeat удаляет эти ngIf, я предполагаю, что ngIf будут уничтожены. Но, как я писал в Edit 2, ваш комментарий заставляет меня задуматься, есть ли какие-то остатки... Я не знаю, где они могут быть...   -  person NoRyb    schedule 05.12.2014


Ответы (1)


Поскольку это представление вкладки, используйте ng-switch вместо ng-if, потому что он должен пройти через все случаи, чтобы отобразить вкладку, а не перейти на вкладку для отображения.

person Claude    schedule 25.11.2014
comment
Это имеет смысл, и я изменил его на ng-switch, но это ничего не изменило с точки зрения производительности. Выражение для случая очень простое (PageNumer === 1) и не очень затратное. Я даже могу оставить страницы как есть (с условием) и просто удалить содержимое (это один элемент — моя директива сетки) - person NoRyb; 25.11.2014
comment
@NoRyb Можете ли вы предоставить плункер, чтобы я мог взглянуть? - person Claude; 25.11.2014
comment
Я создал скрипт: jsfiddle.net/g23pxwh8, к сожалению, я не могу предоставить настоящую директиву. Но это общая проблема, которая у меня есть. Я предполагаю, что angular компилирует все директивы ‹my-complex-grid-directive›, даже если активна только одна страница, и это замедляет работу. - person NoRyb; 25.11.2014