вручную зарегистрируйте шаблонное выражение, чтобы следить за обнаружением изменений - PullRequest
0 голосов
/ 05 августа 2020

Я получаю от пользователя массив и передаю его в стороннюю библиотеку. Поскольку нет выражения, основанного на значениях массива, любые глубокие изменения в массиве не регистрируются для обнаружения изменений, даже с ChangeDetectionStrategy.Default

В частности,

<agm-polygon [paths]="paths"></agm-polygon>
function onUpdate(el){
 this.paths.push(el);
}

не будет работать. Причина в том, что во время обнаружения изменений только зарегистрированные выражения шаблона проверяются на соответствие их предыдущему значению, и, хотя paths зарегистрирован, свойства paths - нет (а обнаружение изменений angular является поверхностным).

Я думаю, мне нужно зарегистрировать свойства массива как выражения шаблона, но не знаю, как.

PS Запуск CD вручную не сработает. CD запускается, он просто игнорирует свойства

Ответы [ 2 ]

0 голосов
/ 05 августа 2020

Возможное решение - реализовать интерфейс DoCheck, а затем выполнить обнаружение пользовательских / глубоких изменений в ngDoCheck.

ngDoCheck() {
 const oldArr = this.oldArr,
       newarr = this.arr;
 ... array comparison logic
}
0 голосов
/ 05 августа 2020

Создайте новый экземпляр массива:

function onUpdate(el){
  this.paths = [...this.paths, el];
}

Это создаст новую ссылку для дочернего компонента, поэтому его onChange будет вызываться, чтобы он мог реагировать на изменения. Надеюсь, у него есть какой-то механизм, позволяющий не перерисовывать все, а только новые или измененные вещи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...