Кажется, есть только два возможных варианта в соответствии с документами https://www.ag-grid.com/javascript-grid-master-detail/#changing-data-refresh. Первый - это подробная таблица, которая перерисовывается каждый раз при изменении данных в главной строке, а вторая - подробная строка вообще не изменяется, если включен флаг suppressRefresh. Странное решение, ужасное поведение ...
Обновлять.
И снова здравствуйте. Нашел купе решений.
Первый - использовать detailCellRendererParams
в параметрах таблицы и установить для параметра suppressRefresh значение true
. Это дает возможность использовать getDetailGridInfo
для получения api
подробной таблицы. В то время как обновление таблицы деталей отключено, использование detailGridInfo
позволяет установить новый data
для таблицы деталей.
useEffect(() => {
const api = gridApiRef;
api && api.forEachNode(node => {
const { detailNode, expanded } = node;
if (detailNode && expanded) {
const detailGridInfo = api.getDetailGridInfo(detailNode.id);
const rowData = detailNode.data.someData; // your nested data
if (detailGridInfo) {
detailGridInfo.api.setRowData(rowData);
}
}
});
}, [results]);
Второй - использовать пользовательский cellRenderer
, wicth гораздо более гибкий и позволяет использовать любой контент внутри cellRenderer. В параметрах таблицы установите detailCellRenderer
: 'yourCustomCellRendereForDetailTable. В yourCustomCellRendereForDetailTable вы можете использовать
this.state = {
rowData: [],
}
У каждого cellRenderer есть метод обновления, который можно использовать следующим образом.
refresh(params) {
const newData = [ ...params.data.yourSomeData];
const oldData = this.state.rowData;
if (newData.length !== oldData.length) {
this.setState({
rowData: newData,
});
}
if (newData.length === oldData.length) {
if (newData.some((elem, index) => {
return !isEqual(elem, oldData[index]);
})) {
this.setState({
rowData: newData,
});
}
}
return true;
}
Использование метода refresh
таким образом дает полностью настраиваемый подход использования detailCellRenderer
.
Примечание. Чтобы получить лучшую производительность при использовании неизменяемых данных, таких как сокращение, необходимо установить immutableData
в true
как в основной, так и в подробной таблице.
person
Roman Lonsky
schedule
12.04.2020