Деталь
Технические вопросы
7.x

Отображение/скрытие детали при определенных условиях

Здравствуйте, уважаемые bpmonline-гуру!
Прошу подсказать как побороть проблему с отображением/скрытием детальки. По условию деталь отображается в карточке контрагента, если тип контрагента, допустим "Подрядчик". При создании нового контрагента и выборе типа деталь отображается/скрывается, но действия для детали не работают, работают только после сохранения карточки, тот же самый "баг" после редактирования карточки -> данные затираются.
на снимках до и после...
p.s.
исходник скрипта:

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() {
                            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;
                        }
                    }
                }
            });

Нравится

3 комментария

Здравствуйте, Александр!
Неправильно реализован биндинг. Попробуйте так:
[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]

Показать все комментарии