Ожидание отображения других элементов

#javascript #html #angular #typescript

Вопрос:

Я прикрепил изображение, чтобы проиллюстрировать проблему. У меня есть 4 элемента на странице:

  • таблица (представляющая собой заголовок с некоторыми данными)
  • диаграмма
  • таблица под диаграммой (в которой в качестве заголовка таблицы используются метки диаграммы)
  • нижний колонтитул

Поскольку первые table имеют только 2 строки (и статичны), tableChart также статичны (всего 5 строк) и footer имеют только одну строку, я хочу динамически вычислить высоту диаграммы.

Итак, я получаю window.height (или контейнер) и уменьшаю table высоту, tableChart высоту и footer высоту. Затем назначьте значение chart элементу. Я делаю это в AfterViewInit рамках жизненного цикла (я тоже пытался DoCheck ), но не могу решить проблему: поскольку элемент #chart отрисовывается одновременно с остальными, когда я получаю #chartTable setChartHeight() метод height inside, он получает только часть общей высоты, необходимой для отрисовки всех 5 строк, поэтому диаграмма будет иметь большую высоту, чем необходимо.

Чтобы быть более конкретным:

  • chartTable имейте нормальную высоту 100 пикселей;
  • поскольку setChartHeight() вызывается слишком рано, chartTable обнаруживается, что он имеет только 20 пикселей (я думаю, что может отображать только первую строку).
  • таким образом, от общего количества 500 пикселей (пример) уменьшится только на 20 пикселей, вместо 100 пикселей, а chart высота составит 480 пикселей (вместо 400 пикселей)

Как я могу дождаться, когда все элементы будут выведены из диаграммы, и только в финале рассчитать их высоту в правильном режиме.

 ngAfterViewInit(): void {
   this.setChartHeight();
}

setChartHeight(): void {
  let container = document.getElementById('container');
  if (typeof container == 'undefined' || container == null) {
    return;
  }

  let table = document.getElementById('table');
  let chartTable = document.getElementById('chartTable');
  let footer = document.getElementById('footer');

  const height = container.clientHeight - table.clientHeight - chartTable.clientHeight - 
  footer.clientHeight;

  let chart = document.getElementById('chart');
  chart.style.height = height   'px';
}
 

Еще одна проблема, которая, я думаю, существует, заключается в том, что chart и chartTable у них один и тот же источник данных. Итак, когда появится источник, поскольку chart элемент находится над chartTable элементом, он будет отрисован первым. Итак, мне нужно отобразить таблицу диаграмм only when I'm sure that , которая уже отображается на странице.

изменить: пример codesandbox

Спасибо

Шаблон

Комментарии:

1. можете ли вы сделать это в codesanbox

2. Если ваш макет разрывается, используйте CSS.

3. Да, вы должны использовать CSS для решения этой проблемы, а не JS

4. Я добавил пример codesandbox. Будучи живой панелью мониторинга, мне нужно, чтобы она соответствовала размеру экрана, поэтому любая панель переполнения не может отображаться.

Ответ №1:

Наконец, как сказали Стрелла и Лиам, я нашел решение, используя css библиотеку и избегая повторного flex-layout использования.

 .container {
  height: 100%;
  display: flex;
  flex-flow: column;
}

.table {
  flex: 0 1 auto;
}

.chart-container {
  flex: 1 1 auto;
  display: flex;
  flex-flow: column;

  amp;__chart {
    flex: 1 1 auto;
  }

  amp;__table {
    flex: 0 1 100px;
  }
}