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

Здравствуйте, уважаемые 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 комментария

Здравствуйте, Александр!
Неправильно реализован биндинг. Попробуйте так:

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();
            }
Показать все комментарии