2014-01-18 1 views
1

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

+0

Да, есть. Угловой триггер цикл $ digest каждый раз, когда что-либо в области изменяется (грязная/чистая проверка). Поэтому он должен перебирать каждую переменную в вашей области действия и проверять, не изменилось ли оно. –

+1

Обратите внимание, что AngularJS не выполняет переваривание $, если что-то изменится, оно будет перевариваться в любое время, когда область применения $ apply'd. – Philipp

+0

@SergiuParaschiv Это неправильно. ** Сначала **, дайджест происходит только тогда, когда он запускается (в основном по директивам/службам). ** Второй **, только зарегистрированные наблюдатели проверяются не всем объектом области. –

ответ

0

Когда вы размещаете что-то на $scope, его можно наблюдать. Вы можете $watch что-нибудь на этом уровне отлично, даже если оно не на шаблоне.

Есть ли штраф за исполнение? AngularJS обычно сравнивает ссылки при просмотре объектов и сравнивает только watched objects, а не все в области. Поэтому, если вы не делаете deep compare на очень большом объекте или массиве, который вы смотрите, это не займет заметного времени.

Для тестирования производительности и наблюдения за тем, что ваши изменения замедляют работу, вы можете использовать AngularJS Batarang.

+1

Чтобы добавить к этому, вы можете смотреть вещи не в области видимости, возвращая их из функции, переданной в качестве первого аргумента в $ watch. –

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