Здравствуйте! У меня есть деталь с полями "Застрахование лица" с одним типом данных. При первой загрузке страницы на который расположена деталь вылетает ошибка в DetailViewModelGenerator на строке: itemViewModelConfig.columns[entitySchema.primaryColumn.name]. и entitySchema = undefined. Если нажать обновить страница деталь раскрывается нормально. Ошибка вылетает только при первому переходе на эту страницу. Подскажите пожалуйста в чем проблема и как ее решить. Спасибо.
Нравится
Здравствуйте, Владимир!
Попробуйте явно в коде детали указать entitySchema, как, например, в детали "Участники активности":
define('ActivityParticipantDetail', ['ext-base', 'terrasoft', 'sandbox', 'ActivityParticipant',
'ConfigurationConstants', 'ActivityParticipantDetailStructure', 'ActivityParticipantDetailResources',
'LookupUtilities'], function(Ext, Terrasoft, sandbox, ActivityParticipant, ConfigurationConstants, structure,
resources, LookupUtilities) {
structure.userCode = function() {
this.entitySchema = ActivityParticipant;
this.name = 'ActivityParticipantDetailViewModel';
...
А также добавить объект детали в зависимости:
Это у меня уже било сделано. Также я пробовал вручную прописывать entitySchema.
if(!InsuredPerson) {
InsuredPerson = Terrasoft.decode("{\"initialConfig\"":{}
Вот код моей детали с полями:
define('UsrInsuredPersonDetail', ['ext-base', 'terrasoft', 'UsrInsuredPerson', 'UsrInsuredPersonDetailStructure',
'UsrInsuredPersonDetailResources'], function(Ext, Terrasoft, UsrInsuredPerson, structure, resources) {
var filterSchemaName;
var getContainerConfig = function(id, styles) {
var container = {
className: 'Terrasoft.Container',
items: [],
id: id,
selectors: {wrapEl: '#' + id}
};
if (styles) {
container.classes = {wrapClassName: styles};
}
return container;
};
structure.userCode = function() {
this.entitySchema = UsrInsuredPerson;
this.name = 'UsrInsuredPersonDetailViewModel';
filterSchemaName = 'Document';
this.name = 'UsrInsuredPersonDetailViewModel';
//this.primaryColumnName = "UsrInsuredPersonField";
this.methods.getCustomItemView = function(viewModel, itemKey, action,types) {
Terrasoft.each(types, function(item) {
item.click = {
bindTo: 'myTypeChanged'
};
});
var columns = viewModel.attributes;
var UsrInsuredPerson = columns[0];
var viewConfig; // = getContainerConfig(itemKey + '-view', 'detail-view-container-user-class');
switch (action) {
case 'add':
case 'copy':
case 'edit':
//var titleConfig = getContainerConfig(itemKey + '-title', 'controlCaption');
viewConfig = getContainerConfig(itemKey + '-view');
var valueConfig = getContainerConfig(itemKey + '-value');
var deleteButtonConfig = {
id: itemKey + '-delete',
className: 'Terrasoft.Button',
classes: {
wrapperClass: 'detail-delete-btn-user-class'
},
imageConfig: resources.localizableImages.DeleteIcon,
style: Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
selectors: {
wrapEl: '#' + itemKey + '-delete'
},
click: {
bindTo: 'delete'
},
width: '10%'
};
var editConfig = {
id: itemKey + '-edit',
className: 'Terrasoft.TextEdit',
markerValue: UsrInsuredPerson.name,
value: {
bindTo: UsrInsuredPerson.name
},
classes: {
wrapperClass: 'detail-delete-btn-user-class'
},
// style: Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
selectors: {
wrapEl: '#' + itemKey + '-delete'
}
};
//titleConfig.items.push(deleteButtonConfig);
valueConfig.items.push(deleteButtonConfig,editConfig);
viewConfig.items.push(valueConfig);
break;
case 'view':
viewConfig = getContainerConfig(itemKey + '-view', 'detail-view-container-user-class');
var valueLabel = {
className: 'Terrasoft.Label',
caption: {
bindTo: UsrInsuredPerson.name,
bindConfig: {converter: Terrasoft.getTypedStringValue}
}
};
viewConfig.items.push(valueLabel);
break;
}
return viewConfig;
};
this.loadedColumns = [
{
columnPath: 'Id'
}, {
columnPath: 'UsrInsuredPersonField'
},{
columnPath: 'UsrDocument'
}
];
this.name = 'UsrInsuredPersonDetailViewModel';
this.parentColumnPath = 'Id';
this.filterColumnPath = filterSchemaName;
this.attributes = [{
type: Terrasoft.core.enums.ViewModelSchemaItem.ATTRIBUTE,
name: 'UsrInsuredPersonField',
columnPath: 'UsrInsuredPersonField',
dataValueType: Terrasoft.DataValueType.TEXT,
isRequired: true
},{
type: Terrasoft.core.enums.ViewModelSchemaItem.ATTRIBUTE,
name: 'UsrDocument',
columnPath: 'UsrDocument',
dataValueType: Terrasoft.DataValueType.LOOKUP
}
];
};
return structure;
});
Владимир, прошу уточнить версию Вашей системы с указанием сборки для восрпоизведения ошибки. Также прошу предоставить код страницы, на которой расположена деталь.
BPM Online 7.2.0.1002.
Деталь расположена на ContractPage.
Переход на эту страницу осуществляется в моем HomeDocumentSection.
Владимир, а при переходе просто из раздела "Документы" нормально работает?
Да, при переходе просто из раздела "Документы" работает нормально.
А при переходи из моего HomeDocumentSection работает нормально только после перегрузки страницы.
Здравствуйте, Владимир!
В таком случае, скорее всего, при переходе не из раздела не инициализируется объект или страница детали.
Попробуйте добавить и то, и другое в блок "Dependencies" страницы "ContractPage".
Добавил, но это не помогло осталась та же ошибка.
Владимир, попробовал воспроизвести ошибку. Выполнил следующее:
1. Добавил объект детали:
2. Добавил страницу детали. Код:
define('UsrInsuredPersonDetail', ['ext-base', 'terrasoft', 'UsrInsuredPerson', 'UsrInsuredPersonDetailStructure', 'UsrInsuredPersonDetailResources'], function(Ext, Terrasoft, UsrInsuredPerson, structure, resources) { var filterSchemaName; var getContainerConfig = function(id, styles) { var container = { className: 'Terrasoft.Container', items: [], id: id, selectors: {wrapEl: '#' + id} }; if (styles) { container.classes = {wrapClassName: styles}; } return container; }; structure.userCode = function() { this.entitySchema = UsrInsuredPerson; this.name = 'UsrInsuredPersonDetailViewModel'; filterSchemaName = 'Document'; this.methods.getCustomItemView = function(viewModel, itemKey, action,types) { Terrasoft.each(types, function(item) { item.click = { bindTo: 'myTypeChanged' }; }); var columns = viewModel.attributes; var UsrInsuredPerson = columns[0]; var viewConfig; // = getContainerConfig(itemKey + '-view', 'detail-view-container-user-class'); switch (action) { case 'add': case 'copy': case 'edit': //var titleConfig = getContainerConfig(itemKey + '-title', 'controlCaption'); viewConfig = getContainerConfig(itemKey + '-view'); var valueConfig = getContainerConfig(itemKey + '-value'); var deleteButtonConfig = { id: itemKey + '-delete', className: 'Terrasoft.Button', click: { bindTo: 'delete' } }; var editConfig = { id: itemKey + '-edit', className: 'Terrasoft.TextEdit', markerValue: UsrInsuredPerson.name, value: { bindTo: UsrInsuredPerson.name } }; valueConfig.items.push(deleteButtonConfig,editConfig); viewConfig.items.push(valueConfig); break; case 'view': viewConfig = getContainerConfig(itemKey + '-view', 'detail-view-container-user-class'); var valueLabel = { className: 'Terrasoft.Label', caption: { bindTo: UsrInsuredPerson.name, bindConfig: {converter: Terrasoft.getTypedStringValue} } }; viewConfig.items.push(valueLabel); break; } return viewConfig; }; this.loadedColumns = [ { columnPath: 'Id' }, { columnPath: 'UsrInsuredPersonField' },{ columnPath: 'UsrDocument' } ]; this.parentColumnPath = 'Id'; this.filterColumnPath = filterSchemaName; this.attributes = [{ type: Terrasoft.core.enums.ViewModelSchemaItem.ATTRIBUTE, name: 'UsrInsuredPersonField', columnPath: 'UsrInsuredPersonField', dataValueType: Terrasoft.DataValueType.TEXT, isRequired: true },{ type: Terrasoft.core.enums.ViewModelSchemaItem.ATTRIBUTE, name: 'UsrDocument', columnPath: 'UsrDocument', dataValueType: Terrasoft.DataValueType.LOOKUP } ]; }; return structure; });
На странице добавил в Dependencies объект детали, назвал зависимость по имени объекта - "UsrInsuredPerson".
3. Заместил ContractPage и добавил объект "UsrInsuredPerson" в Dependencies. Код замещающей страницы:
define('ContractPage', ['ext-base', 'terrasoft','sandbox', 'ContractPageStructure','ContractPageResources', 'BusinessRuleModule','ConfigurationEnums'], function(Ext, Terrasoft,sandbox, structure, resources, BusinessRuleModule,ConfigurationEnums) { structure.userCode = function() { this.schema.leftPanel.push({ name: 'UsrInsuredPerson', schemaName: 'UsrInsuredPersonDetail', type: Terrasoft.ViewModelSchemaItem.DETAIL, filterPath: 'UsrDocument', filterValuePath: 'Id', caption: 'insured person', leftWidth: '60%', collapsed: false, rightWidth: '40%', wrapContainerClass: 'control-group-container', visible: true }); this.methods.init = function() { this.setReadOnlyDetails(['UsrInsuredPerson'], true); }; }; return structure; });
4. Пробую воспроизвести путем перехода на страницу редактирования документа напрямую, то есть чищу кэш, вставляю в адресную строку браузера строку вида "http://localhost:7201/0/Nui/ViewModule.aspx#CardModule/ContractPage/edi…" и все загружается без проблем.
Может я что-то упустил при воспроизведении?
Я уже нашел ошибку. Ошибка была в моем HomeDocumentSection с которого осуществляется переход на страницу где расположена деталь. Спасибо за помощь.