2016-01-30 2 views
95

Как заставить повторный рендеринг компонента в угловом 2? Для целей отладки, работающих с Redux, я хотел бы заставить компонент повторно отобразить его представление, возможно ли это?Как принудительно перепрофилировать компонент в угловом 2?

+0

Что вы подразумеваете под «повторным рендерингом». Обновить привязки? –

+0

Просто быстрый вопрос, почему вам нужно принудительно повторить рендеринг? –

+4

Возможный дубликат [Triggering Angular2 change detection вручную] (http://stackoverflow.com/questions/34827334/triggering-angular2-change-detection-manually) – blo0p3r

ответ

138

рендеринга происходит после обнаружения изменений. Для того, чтобы заставить обнаружения изменений, так что компонент значения свойств, которые изменились получить распространяющееся в DOM (а затем браузер отображает эти изменения в представлении), вот несколько вариантов:

  • ApplicationRef.tick() - аналогичны Угловой 1-х $rootScope.$digest() - т. е. проверить полное дерево компонентов
  • NgZone.run(callback) - аналогично $rootScope.$apply(callback) - т. е. оценить функцию обратного вызова внутри зоны углового 2. Я думаю, но я не уверен, что это завершает проверку полного дерева компонентов после выполнения функции обратного вызова.
  • ChangeDetectorRef.detectChanges() - аналогично $scope.$digest() - то есть проверить только этот компонент и его потомков

Вы можете впрыснуть ApplicationRef, NgZone или ChangeDetectorRef в компонент.

Для вашего конкретного сценария я бы рекомендовал последний вариант, если изменился только один компонент.

+3

попробуйте все из них, но все еще не работают на ios, – vuhung3990

+1

Любой рабочий код на ChangeDetectorRef для окончательной версии angular2? Теперь я сталкиваюсь с ситуацией, когда представление не обновляется после запроса на пост http для создания нового пользователя, а затем при успешном нажатии нового объекта на существующий старый список пользователей (используется для итерации в поле зрения). Весьма странно, что «это первый раз, когда я сталкиваюсь с обновлением, которое не работает в ng2». Стратегия обнаружения изменений по умолчанию, поэтому я знаю, что я не испортил стратегию обнаружения изменений. – Gary

+0

@Gary, вы должны опубликовать новый вопрос и включить свой компонент и код обслуживания (в идеале, включить минимальный плункер, демонстрирующий проблему). Общей проблемой, которую я видел, не является использование надлежащего контекста 'this' в обратном вызове POST. –

33

ТЕ, нашел обходной путь мне нужно:

constructor(private zone:NgZone) { 
    // enable to for time travel 
    this.appStore.subscribe((state) => { 
     this.zone.run(() => { 
      console.log('enabled time travel'); 
     }); 
    }); 

работает zone.run вынудит компонент для повторной визуализации

+3

Что такое appStore в этом контексте - какая переменная и ее тип? кажется наблюдаемым ... но мой наблюдаемый внутри компонента, который я хочу обновить одним нажатием кнопки ... и я не знаю, как получить доступ к методу/переменной дочернего компонента из родительского/текущего местоположения –

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