Как заставить рендеринг компонента в Angular 2? В целях отладки, работая с Redux, я хотел бы заставить компонент перерисовать его представление, это возможно?
angular
angular2-changedetection
born2net
источник
источник
Ответы:
Рендеринг происходит после обнаружения изменений. Для принудительного обнаружения изменений, чтобы значения свойств компонентов, которые изменились, были переданы в DOM (а затем браузер отобразит эти изменения в представлении), вот несколько вариантов:
$rootScope.$digest()
т. Е. Проверить полное дерево компонентов$rootScope.$apply(callback)
- т.е. оценивает функцию обратного вызова внутри зоны Angular 2. Я думаю, но я не уверен, что это заканчивается проверкой полного дерева компонентов после выполнения функции обратного вызова.$scope.$digest()
- т.е. проверять только этот компонент и его дочерние элементыВам нужно будет импортировать , а затем инъекционные
ApplicationRef
,NgZone
илиChangeDetectorRef
в компонент.Для вашего конкретного сценария я бы порекомендовал последний вариант, если изменился только один компонент.
источник
this is the first time I am facing an update not working in ng2
. Стратегия обнаружения изменений по умолчанию, поэтому я знаю, что не ошибся со стратегией обнаружения изменений.this
контекста в обратном вызове POST.pure:false
в канале. Это работает, но это слишком дорого (неэффективно) для моего варианта использования.TX, нашел обходной путь, который мне был нужен:
запуск zone.run заставит компонент повторно выполнить рендеринг
источник
Подход ChangeDetectorRef
источник
Я принудительно перезагружаю свой компонент, используя * ngIf.
Все компоненты внутри моего контейнера возвращаются к крюкам полного жизненного цикла.
В шаблоне:
Тогда в файле ts:
источник
setTimeout()
. Теперь моя работает с простым и легким решением!Другие ответы здесь предоставляют решения для запуска циклов обнаружения изменений, которые обновят представление компонента (что отличается от полного повторного рендеринга).
Полное повторное рендер, который уничтожит и переинициализировать компонент (вызов все крюки жизненный цикл и восстановление зрения) может быть сделано с помощью
ng-template
,ng-container
иViewContainerRef
в следующим образом:Затем в компоненте , имеющая ссылку как
#outlet
и#content
мы можем очистить содержание торговых точек и вставить другой экземпляр дочернего компонента:Дополнительно начальный контент должен быть вставлен на
AfterContentInit
крючок:Полное рабочее решение можно найти здесь https://stackblitz.com/edit/angular-component-rerender .
источник
ChangeDetectorRef.detectChanges()
обычно это самый сфокусированный способ сделать это.ApplicationRef.tick()
обычно слишком много подхода кувалды.Чтобы использовать
ChangeDetectorRef.detectChanges()
, вам нужно это в верхней части вашего компонента:... тогда обычно вы называете это псевдонимом, когда вставляете его в свой конструктор так:
constructor( private cdr: ChangeDetectorRef ) { ... }
Затем в соответствующем месте вы называете это так:
Где вы звоните,
ChangeDetectorRef.detectChanges()
может быть очень важным. Вам необходимо полностью понять жизненный цикл и то, как именно ваше приложение функционирует и отображает его компоненты. Здесь нет альтернативы тому, чтобы полностью выполнить домашнюю работу и убедиться, что вы понимаете жизненный цикл Angular наизнанку. Затем, как только вы поймете это, вы сможете использовать егоChangeDetectorRef.detectChanges()
соответствующим образом (иногда очень легко понять, где вы должны его использовать, в других случаях это может быть очень сложным).источник