#javascript #angular
#javascript #angular
Вопрос:
У меня есть компонент, в котором диаграмма width
хранится в переменной (не могу использовать style. это для d3
). Однако всякий раз, когда я меняю маршрут, все переменные в этом компоненте класса получают undefined
значения.
Я пытался ngIf
использовать службы (они тоже не определены) ngOnDestroy()
(они не вызываются при изменении маршрутизации)
Вот мой код с дополнительными пояснениями.
класс компонента:
Вы можете видеть переменную, setWidth
которая отслеживает width
d3
диаграмму, и она изменяется undefined
при изменении маршрута, и я не уверен из-за ngOnChange
того, что HostListener
определяет размер окна и изменяет его width
соответствующим образом, даже если оно прерывается после изменения маршрута.
export class BrushBarChartComponent implements OnInit, OnChanges
{
@Input() timeSeriesData: Object;
@ViewChild('timeSeriesChart', { static: true }) private timeSeriesChart: ElementRef;
setWidth: number;
constructor() { }
ngOnInit() {}
ngOnChanges() {
this.render();
}
@HostListener('window:resize', ['$event'])
onScreenResize () {
this.render();
}
render() {
let divWidth = this.timeSeriesChart.nativeElement.offsetWidth;
if (divWidth === 0) {
divWidth = this.setWidth;
} else {
this.setWidth = divWidth;
}
const margin = { top: 20, right: 50, bottom: 90, left: 40 },
margin2 = { top: 130, right: 50, bottom: 30, left: 40 },
width = divWidth - margin.left - margin.right;
}
}
Вот шаблон:
<div id="timeSeriesChart" #timeSeriesChart *ngIf="DestroyHide"></div>
Вот как файл маршрута обрабатывает запрос на изменение маршрута. Не удается опубликовать весь код в файле.
{
path: 'delete',
loadChildren: () => import('app/delete/delete.module').then(m => m.deleteModule),
canActivate: [AuthGuard],
data: {preload: true}
}
Комментарии:
1. Трудно сказать, почему это происходит, потому что неясно, каковы отношения маршрутов, возможно, этот компонент должен выгрузиться и быть уничтожен.
2. Пожалуйста, скажите, ваша первоначальная проблема заключается только в том, что render вызывается до создания html, а timeSeriesChart не имеет ширины? Причина: я не уверен, зачем вам нужно создавать такую переменную.
3. Проблема в том, что он при загрузке компонента… setWith будет неопределенным. Значение будет получено только при
timeSeriesData
изменениях или изменении размера экрана. Ему нужно реализовать это таким образом, чтобыsetWidth
получал значение при инициализации компонента… что, по сути, является началомoffsetWidth
timeSeriesChart.nativeElement
.4. @MosiaThabo именно из-за этой настройки эта переменная не имеет смысла — offsetWidth в любом случае запрашивается при каждом вызове рендеринга, нет смысла сохранять ее и вызывать offsetWidth снова в следующий раз.
5. Возможно, вы захотите, потому что это может быть жизнеспособным, который он использует внутри шаблона. Или, возможно, где-то внутри этого класса. Я бы не стал беспокоиться о том, что он с этим делает, представьте, что ему приходится вызывать
this.timeSeriesChart.nativeElement.offsetWidth
везде, где он хочет использовать это значение?
Ответ №1:
Вам нужно помнить, как ngOnChanges()
. В вашем случае этот метод будет выполняться при вводе изменений данных boad. Я имею в виду это @Input() timeSeriesData: Object;
Таким образом, в основном, ngOnChanges()
вызывается при timeSeriesData
изменении. это не вызывается изменением маршрута.
Предложение:
Возможно, вы захотите запустить свой render()
на ngOnInit()
, потому что это делается один раз при загрузке компонента. Таким образом, в основном изменения в ваших переменных будут происходить только при изменении размера или значения входных данных.
Возможно, вы захотите взглянуть на это и это для получения дополнительной информации об этих методах жизненного цикла. Вы найдете статьи полезными.