Создал иерархическую деталь с редактируемым реестром. Но появилась проблема при количестве дочерних элементов больше 8. Они почему не отображаются, выдается ошибка Cannot read property 'getAttribute' of null. В БД всё верно.
Вот код детали
define("IDSBRefrigeratorInTMADetail",
["ConfigurationGrid", "ConfigurationGridGenerator", "ConfigurationGridUtilities"],
function () {
return {
messages: {
"ReloadRefrigeratorsInTMAGrid": {
"mode": Terrasoft.MessageMode.BROADCAST,
"direction": Terrasoft.MessageDirectionType.SUBSCRIBE
}
},
entitySchemaName: "IDSBRefrigeratorInTMA",
attributes: {
"IsEditable": {
dataValueType: Terrasoft.DataValueType.BOOLEAN,
type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
value: true
}
},
mixins: {
ConfigurationGridUtilities: "Terrasoft.ConfigurationGridUtilities"
},
details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
diff: /**SCHEMA_DIFF*/[
{
"operation": "merge",
"name": "DataGrid",
"values": {
"hierarchical": true,
"hierarchicalColumnName": "IDSBParent",
"maxColumns": 48,
"maxRowsCount": 10000,
"className": "Terrasoft.ConfigurationGrid",
"generator": "ConfigurationGridGenerator.generatePartial",
"generateControlsConfig": { "bindTo": "generateActiveRowControlsConfig" },
"changeRow": { "bindTo": "changeRow" },
"unSelectRow": { "bindTo": "unSelectRow" },
"onGridClick": { "bindTo": "onGridClick" },
"activeRowAction": { "bindTo": "onActiveRowAction" },
"initActiveRowKeyMap": { "bindTo": "initActiveRowKeyMap" },
"multiSelect": false
}
},
{
"operation": "remove",
"name": "AddRecordButton"
}]/**SCHEMA_DIFF*/,
methods: {
generateActiveRowControlsConfig: function (id, columnsConfig, rowConfig) {
this.columnsConfig = columnsConfig;
var gridData = this.getGridData();
var activeRow = gridData.get(id);
var isEditableColumn;
if (activeRow.values.IDSBParent === "") {
isEditableColumn = this.isEditableParentColumn;
}
else {
isEditableColumn = this.isEditableColumn;
}
var gridLayoutItems = [];
var currentColumnIndex = 0;
Terrasoft.each(columnsConfig, function (columnConfig) {
var cellConfig = this.getActiveRowCellConfig(columnConfig, currentColumnIndex);
cellConfig.enabled = isEditableColumn(cellConfig.name);
if (!cellConfig.hasOwnProperty("isNotFound")) {
gridLayoutItems.push(cellConfig);
}
currentColumnIndex += cellConfig.layout.colSpan;
}, this);
this.applyBusinessRulesForActiveRow(id, gridLayoutItems);
var viewGenerator = Ext.create(this.getRowViewGeneratorClassName());
viewGenerator.viewModelClass = this;
var gridLayoutConfig = viewGenerator.generateGridLayout({
name: this.name,
items: gridLayoutItems
});
rowConfig.push(gridLayoutConfig);
},
isEditableParentColumn: function (columnName) {
return false;
},
isEditableColumn: function (columnName) {
return (columnName === "IDSBBottlePlan");
}/*,
init: function () {
this.callParent(arguments);
this.sandbox.subscribe("ReloadRefrigeratorsInTMAGrid", this.onReloadRefrigeratorsInTMAGrid, this);
},
onReloadRefrigeratorsInTMAGrid: function (args) {
this.reloadGridData();
}*/
}
};
});
Нравится
Для упрощения отладки посмотрите SQL профайлером запросы которые отправляются в БД.
Григорий Чех, думаете нужно заместить метод addGridDataColumns?
Григорий имел в виду использование профайлера. Естественно, только для случаев, когда есть доступ к серверу БД.
посмотрел профайлер. Выполняется следующий запрос. Забил его сам в SQL Management. Выдал недостающие элементы, которые как раз невыведены на экран. Ошибка возникает когда нажимаю "Показать больше"
SELECT
[IDSBRefrigeratorInTMA].[Id] [Id],
[IDSBRefrigeratorInTMA].[IDSBStreet] [IDSBStreet],
[IDSBRefrigeratorInTMA].[IDSBCustomerInTMAId] [IDSBCustomerInTMAId],
[IDSBRefrigeratorInTMA].[ITTradeMarketId] [ITTradeMarketId],
[ITTradeMarket].[ITName] [ITTradeMarket.ITName],
[IDSBRefrigeratorInTMA].[MonthId] [MonthId],
[Month].[Name] [Month.Name],
[IDSBRefrigeratorInTMA].[IDSBBottlePlan] [IDSBBottlePlan],
[IDSBRefrigeratorInTMA].[IDSBParentId] [IDSBParentId],
[IDSBParent].[IDSBStreet] [IDSBParent.IDSBStreet],
[ITTradeMarket].[ITTypeId] [ITTradeMarket.ITTypeId],
[ITType].[Name] [ITType.Name],
(
SELECT
COUNT([SubEntryPoint].[Id]) [Count]
FROM
[dbo].[EntryPoint] [SubEntryPoint] WITH(NOLOCK)
WHERE
[SubEntryPoint].[EntityId] = [IDSBRefrigeratorInTMA].[Id]
AND [SubEntryPoint].[IsActive] = 1) [SubEntryPoint],
[IDSBRefrigeratorInTMA].[CreatedOn] [CreatedOn],
[IDSBRefrigeratorInTMA].[CreatedById] [CreatedById],
[CreatedBy].[Name] [CreatedBy.Name],
[CreatedBy].[PhotoId] [CreatedBy.PhotoId],
[IDSBRefrigeratorInTMA].[ModifiedOn] [ModifiedOn],
[IDSBRefrigeratorInTMA].[ModifiedById] [ModifiedById],
[ModifiedBy].[Name] [ModifiedBy.Name],
[ModifiedBy].[PhotoId] [ModifiedBy.PhotoId],
[IDSBRefrigeratorInTMA].[ProcessListeners] [ProcessListeners]
FROM
[dbo].[IDSBRefrigeratorInTMA] [IDSBRefrigeratorInTMA] WITH(NOLOCK)
LEFT OUTER JOIN [dbo].[ITTradeMarket] [ITTradeMarket] WITH(NOLOCK) ON ([ITTradeMarket].[Id] = [IDSBRefrigeratorInTMA].[ITTradeMarketId])
LEFT OUTER JOIN [dbo].[Month] [Month] WITH(NOLOCK) ON ([Month].[Id] = [IDSBRefrigeratorInTMA].[MonthId])
LEFT OUTER JOIN [dbo].[IDSBRefrigeratorInTMA] [IDSBParent] WITH(NOLOCK) ON ([IDSBParent].[Id] = [IDSBRefrigeratorInTMA].[IDSBParentId])
LEFT OUTER JOIN [dbo].[ITITTradeMarketType1] [ITType] WITH(NOLOCK) ON ([ITType].[Id] = [ITTradeMarket].[ITTypeId])
LEFT OUTER JOIN [dbo].[Contact] [CreatedBy] WITH(NOLOCK) ON ([CreatedBy].[Id] = [IDSBRefrigeratorInTMA].[CreatedById])
LEFT OUTER JOIN [dbo].[Contact] [ModifiedBy] WITH(NOLOCK) ON ([ModifiedBy].[Id] = [IDSBRefrigeratorInTMA].[ModifiedById])
WHERE
[IDSBRefrigeratorInTMA].[ITTradeMarketId] = '54368FDE-6D00-4BDE-BAAE-EDEA56EBAA33'
ORDER BY
[Id] ASC OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY
Может, 8 элементов видно как раз из-за выборки порциями по 10? Судя по окончанию SQL-запроса, это как раз вторая десятка, первая пропущена.
А где именно вылетает «Cannot read property 'getAttribute' of null», полный стек не видно?
Вылетает на этом методе. В строке var n = this.getDomRow(i) в n кладется undefined и далее соответственно вылетает ошибка. В i в этот момент родительская колонка
onCollectionDataLoaded: function(e, t, a) {
if (this.theoreticallyActiveRows = null,
!this.rows.length)
return this.collection = this.collection || e,
this.prepareCollectionData(),
void this.safeRerender();
if (!Ext.Object.isEmpty(t) && this.rendered) {
var r = []
, s = {
rows: r
};
if (t.each(function(e) {
this.prepareCollectionItem(e);
var t = this.getRow(e);
r.push(t),
a && ("top" !== a.mode ? this.rows.push(t) : this.rows.splice(0, 0, t))
}, this),
this.hierarchical && !t.isEmpty()) {
var i = t.getByIndex(0).get(this.hierarchicalColumnName);
if (s[this.hierarchicalColumnName] = i,
"listed" === this.type && i) {
var n = this.getDomRow(i)
, o = parseInt(n.getAttribute("level"), 10);
s.rowLevel = o + 1
}
}
var l = [];
this.renderGrid(l, s);
for (var c = "", h = 0, u = l.length; h < u; h += 1)
c += Ext.DomHelper.createHtml(l[h]);
Ext.Object.isEmpty(a) && (a = {
mode: "bottom"
}),
this.addRows(c, a),
this.checkNeedLoadData()
}
},
Что-то не могу найти такой функции в «коробке».
А иерархичность и редактируемость сами по себе совместимы? На других таких деталях ограничения в 8 нет?
Если убираю редактируемость, ошибка не исчезает. Если убираю иерархичность, всё отображается нормально
Это логично, если сбой при превышении 8 потомков. В плоской детали никаких потомков нет. Сравните с другими иерархическими деталями, есть там такое ограничение или нет?
Решил проблему. Добавил значения атрибутов, чтобы всё грузилось сразу. В моем случае такое решение вполне подходит
init: function () {
this.callParent(arguments);
this.set("IsPageable", false);
this.set("RowCount", 28000);
this.sandbox.subscribe("ReloadRefrigeratorsInTMAGrid", this.onReloadRefrigeratorsInTMAGrid, this);
},
Спасибо за информацию. Но нужно учитывать возможные побочные эффекты: если записей будет очень много, то придётся загружать их все, что ресурсоёмко.