Отображение/скрытие детали при определенных условиях
Здравствуйте, уважаемые 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;
}
}
}
});
Нравится
Здравствуйте, Александр!
Неправильно реализован биндинг. Попробуйте так:
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; } } } } });
По-другому можно биндить на аттрибут, на init и при изменении поля 'Type' проверять условия и устанавливать в аттрибут значение:
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); }
Здравствуйте, Андрей!
Спасибо большое за советы, я попробовал первый вариант, однако выскакивает в консоле ошибка:
Если изменить строку условия в функции на:
converter: function(value) { if (value) {
тогда все проходит, но эффект остается тот же, при смене типа "Контрагента", данные не подтягиваются.
Прошу подскажите подробнее как использовать второй вариант.
Александр, у меня работает следующим образом:
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%' } );
Немного изменил проверку, но это не влияет на работоспособность кода, просто выглядит лучше.
А что у Вас не срабатывает? Вы же можете поставить точку останова в методе и проверить, какое условие срабатывает:
Второй вариант:
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(); }