- Есть ли способ отключить или предотвратить запуск функции таймера или интервала RxJS обнаружения изменения угла?Использование NgZone zone.runOutsideAngular (() => this.interval $ = interval (1000) ...), по-видимому, не делает этого.
Это потому, что наблюдаемые являются холодными, и значениепродюсер (setInterval) выполняется только тогда, когда происходит подписка.Хотя этот код выполняется за пределами угловой зоны:
() => this.interval $ = интервал (1000) ...
, на самом деле он не сразувызовите производителя значений внутри оператора interval
.Это будет позже вызвано, когда AsyncPipe в IntervalInnerComponent
подписывается.И это происходит во внутренней угловой зоне:
![enter image description here](https://i.stack.imgur.com/XFKMZ.png)
Используя тему в следующей альтернативе, вы делаете ее горячей и подписываетесь сразу за пределами угловой зоны.
В качестве альтернативы, если я создаю наблюдаемый поток с использованием субъекта RxJS в сочетании с setInterval, вызываемым внутри zone.runOutsideAngular ... создаются значения setInterval (на них можно подписаться вручную), но асинхронный канал не запускаетсяобнаружение изменений
Поскольку Async Pipe не запускает обнаружение изменений.Он просто отмечает компонент и всех его предков для проверки во время следующего обнаружения изменений, когда бы он ни был.См. ответ или эту статью для получения более подробной информации.Zone.js запускает обнаружение изменений.Но поскольку вы запускаете setInterval
за пределами угловой зоны, это не сработает.В этой настройке у вас есть несколько вариантов:
- inject
ChangeDetectorRef
и ручное инициирование обнаружения изменений для компонента и его предков - inject
ApplicationRef
и ручное инициирование обнаружения изменений длявсе приложение