Область Angular Formly, существующая после $destroy, утечка памяти

У меня есть утечка памяти в моем приложении из-за того, что области элементов не уничтожаются.

Для следующего поля:

   vm.fields.data.directions = [
  {
    type: 'required-textarea',
    key: 'step',
    templateOptions:{
      label: 'Directions',
      placeholder: 'Wrap a bacon piece around each spear; secure ends with a toothpick.'
    },
    expressionProperties: {
      'link' : function($viewValue, $modelValue, scope){
        scope.$on('$destroy', function () {
          $timeout(function() {
            console.log(scope);
          }, 100);
        });
      }
    }

Это утешает область, полностью нетронутую несколькими наблюдателями. Для моего приложения у меня есть несколько вкладок для ввода различных полей формы, некоторые из которых содержат около 20 из указанных выше полей. Каждый раз, когда вкладка перемещается и снова нажимается, количество наблюдателей за приложениями продолжает расти, поскольку область действия никогда не уничтожается.

Почему область видимости существует здесь после того, как вызывается destroy?


person byrdr    schedule 28.01.2016    source источник


Ответы (1)


Есть проблема с логикой вашего теста: во время события $destroy область действия еще не была уничтожена, поэтому она всегда будет отображаться в журнале вашей консоли.

Из документов:

Непосредственно перед уничтожением области видимости в этой области передается событие $destroy. Код приложения может зарегистрировать обработчик события $destroy, который даст ему возможность выполнить любую необходимую очистку.

Тот факт, что ваш код журнала консоли срабатывает, указывает на то, что прицел фактически уничтожается.

person Shaun Scovil    schedule 28.01.2016
comment
Разрушенная область видимости верна; однако все наблюдатели существуют и никогда не удаляются на протяжении всей жизни приложения. - person byrdr; 28.01.2016
comment
Как ты это определяешь? Пробовали ли вы этот скрипт: medium.com/@kentcdodds/ - person Shaun Scovil; 28.01.2016
comment
Я добавил тайм-аут, чтобы быть уверенным. Смотрю в бэтаранг. Счетчик наблюдателей увеличивается на то же количество наблюдателей, которые утешаются в области, которая уничтожается. - person byrdr; 28.01.2016
comment
Этот ответ SO может пролить свет на ситуацию с наблюдателем: stackoverflow.com/a/25114028/630544 - скорее всего, наблюдатели добавляются в область $parent и не удаляются. Вы можете сделать это в своем обработчике событий $destroy, если сможете выяснить, что добавляется, а что не удаляется. - person Shaun Scovil; 28.01.2016