Отображение/скрытие детали при определенных условиях
Здравствуйте, уважаемые bpmonline-гуру!
Прошу подсказать как побороть проблему с отображением/скрытием детальки. По условию деталь отображается в карточке контрагента, если тип контрагента, допустим "Подрядчик". При создании нового контрагента и выборе типа деталь отображается/скрывается, но действия для детали не работают, работают только после сохранения карточки, тот же самый "баг" после редактирования карточки -> данные затираются.
на снимках до и после...
p.s.
исходник скрипта:
name: 'Vehicle',
schemaName: 'VehicleDetail',
type: Terrasoft.ViewModelSchemaItem.DETAIL,
filterPath: 'Account',
filterValuePath: 'Id',
caption: resources.localizableStrings.VehicleDetailCaption,
collapsed: true,
leftWidth: '60%',
rightWidth: '40%',
wrapContainerClass: 'control-group-container',
visible: {
bindTo: 'Type',
bindConfig: {
converter: function() {
if (this.get("Type")) {
var type = this.get("Type").value;
if((type == 'f3c0ce97-53e6-df11-971b-001d60e938c6')
|| (type == '57412fad-53e6-df11-971b-001d60e938c6')){
return true;}
} else {
return false;
}
return false;
}
}
}
});
Нравится
Здравствуйте, Александр!
Неправильно реализован биндинг. Попробуйте так:
[javascript]
this.schema.rightPanel.push({
name: 'Vehicle',
schemaName: 'VehicleDetail',
type: Terrasoft.ViewModelSchemaItem.DETAIL,
filterPath: 'Account',
filterValuePath: 'Id',
caption: resources.localizableStrings.VehicleDetailCaption,
collapsed: true,
leftWidth: '60%',
rightWidth: '40%',
wrapContainerClass: 'control-group-container',
visible: {
bindTo: 'Type',
bindConfig: {
converter: function(value) {
if (value.value)
{
var type = value.value;
}
else
{
var type = value;
}
if((type == 'f3c0ce97-53e6-df11-971b-001d60e938c6')
|| (type == '57412fad-53e6-df11-971b-001d60e938c6')){
return true;
}
else {
return false;
}
}
}
}
});
[/javascript]
По-другому можно биндить на аттрибут, на init и при изменении поля 'Type' проверять условия и устанавливать в аттрибут значение:
[javascript]
if (this.get("Type")) {
var type = this.get("Type").value;
var visible = ((type == 'f3c0ce97-53e6-df11-971b-001d60e938c6')
|| (type == '57412fad-53e6-df11-971b-001d60e938c6')){
this.set("myAttr", visible);}}
else {
this.set("myAttr", false);
}
[/javascript]
Здравствуйте, Андрей!
Спасибо большое за советы, я попробовал первый вариант, однако выскакивает в консоле ошибка:
Если изменить строку условия в функции на:
[javascript]
converter: function(value) {
if (value)
{
[/javascript]
тогда все проходит, но эффект остается тот же, при смене типа "Контрагента", данные не подтягиваются.
Прошу подскажите подробнее как использовать второй вариант.
Александр, у меня работает следующим образом:
[javascript]
var accountTypes = ['03a75490-53e6-df11-971b-001d60e938c6', '57412fad-53e6-df11-971b-001d60e938c6'];
this.schema.rightPanel.push(
{
name: 'accountCase',
schemaName: 'CaseDetail',
type: Terrasoft.ViewModelSchemaItem.DETAIL,
filterPath: 'Account',
filterValuePath: 'Id',
caption: resources.localizableStrings.CaseDetailCaption,
visible: {
bindTo: 'Type',
bindConfig: {
converter: function (value) {
if (value && value.value) {
var type = value.value;
}
else {
return true;
}
if (accountTypes.indexOf(type)>-1) {
return true;
}
else {
return false;
}
}
}
},
leftWidth: '60%',
rightWidth: '40%'
}
);
[/javascript]
Немного изменил проверку, но это не влияет на работоспособность кода, просто выглядит лучше.
А что у Вас не срабатывает? Вы же можете поставить точку останова в методе и проверить, какое условие срабатывает:
![]()
Второй вариант:
[javascript]
var accountTypes = ['03a75490-53e6-df11-971b-001d60e938c6', '57412fad-53e6-df11-971b-001d60e938c6'];
this.schema.rightPanel.push(
{
name: 'accountCase',
schemaName: 'CaseDetail',
type: Terrasoft.ViewModelSchemaItem.DETAIL,
filterPath: 'Account',
filterValuePath: 'Id',
caption: resources.localizableStrings.CaseDetailCaption,
visible: {
bindTo: 'Test'
},
leftWidth: '60%',
rightWidth: '40%'
}
);
var typeControl = this.find('Type');
if (typeControl) {
typeControl.dependencies = ['Type'];
typeControl.methodName = 'setDetailVisible';
}
this.methods.setDetailVisible = function() {
var value = this.get('Type');
if (value && value.value) {
var type = value.value;
}
else {
this.set('Test', true);
return;
}
if (accountTypes.indexOf(type) > -1) {
this.set('Test', true);
}
else {
this.set('Test', false);
}
}
var baseInit = this.methods.init;
this.methods.init = function() {
if (Ext.isFunction(baseInit)) {
baseInit.call(this);
}
this.setDetailVisible();
}
[/javascript]