2017-02-09 3 views
1

У меня есть странная проблема, которую я не могу решить в течение нескольких часов.Angular2 private variable не обновляется в ngOnChanges()

В моем компоненте у меня есть:

@Input() content : string; 

private contentPreview : any; 

ngOnChanges(changes: SimpleChanges) { 
    this.contentPreview = changes['content'].currentValue; 
    console.log(changes['content'].currentValue); // <-- WORKS 
} 

Переменная this.contentPreview не изменяется. Если я попытаюсь отобразить его, он останется неопределенным. Даже если я попробую this.contentPreview = "X"; он остается неопределенным везде в компоненте.

Я что-то упустил, или это ошибка?

+0

Возможно, это связано с тем, что цикл обнаружения изменений уже завершен. Таким образом, одно изменение «content» запускает hook onChanges, оно обновляет contentPreview var, но это конец цикла обнаружения изменений, после чего DOM не обновляется после этого. – MikeOne

+0

Возможно, вы можете решить это с помощью крюка doCheck, найти здесь: https://angular.io/docs/ts/latest/guide/lifecycle-hooks.html#!#onchanges – MikeOne

+0

Майк, спасибо! Я получаю точку цикла. Однако я попытался отобразить приватную переменную после другого события (например, щелкнуть по компоненту), и значение не было сохранено. Так оно и должно работать? –

ответ

1

Я не мог воспроизвести вашу проблему. Но вы можете попробовать обновить с помощью NgZone, так как вы сказали, что console.log работает, поэтому это означает, что крюк хотя бы называется, но по какой-то причине он не обновляет DOM. Так что попробуйте:

вашего ребенка компонента:

import {NgZone} from '@angular/core' 

вводят его в конструктор:

constructor(private ngZone: NgZone) { } 

, а затем в вашем OnChanges:

ngOnChanges(changes: SimpleChanges) { 
    this.ngZone.run(() => this.contentPreview = changes['content'].currentValue;) 
} 

Вот Plunker

+0

Спасибо за ваше время! То, что я вижу в Chrome, заключается в том, что контент фактически помещается в «ng-reflect-content-t» в компоненте . И компонент по-прежнему содержит начальное значение. Любая идея по этому поводу, пожалуйста? –

+0

Хм. Не могли бы вы попытаться воспроизвести проблему в плункер? Вы можете разветвить тот, который я предоставил, и я был бы рад взглянуть на него :) – Alex

+0

Мой скрипт выглядит очень похож на ваш, но шаблон не отображается. Вместо этого данные хранятся в ng-reflect-variablename –

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