Создал иерархическую деталь с редактируемым реестром. Но появилась проблема при количестве дочерних элементов больше 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); },
Спасибо за информацию. Но нужно учитывать возможные побочные эффекты: если записей будет очень много, то придётся загружать их все, что ресурсоёмко.