Добрый день. Возникла необходимость в bpmonline 7.5, в контактах, на детали "средства связи", динамически менять список социальных сетей, в зависимости от типа контакта. А также менять тип кнопки добавить (точнее убирать типы адресов и оставлять только кнопку добавить без выпадающего списка), детали "Адрес", тоже в зависимости от типа контакта. Проблема в том что скрипты выполняются только при инициализации страницы, т.е. они работают только если полностью перезагрузить страницу. Пробовал методы updateDetail, reloadDetail. Не работает, хотя reloadDetail, не отработал, вызывал так this.reloadDetail('ContactAddress'). Подскажите пожалуйста, как можно решить эту проблему.

Нравится

11 комментариев

Здравствуйте, Владислав!
Не проще ли вместо перезагрузки детали просто вызывать методы, которые выполняются при инциализщации и устанавливают необходимые параметры?
Вы же используете привязку (bindTo) свойств для управления видимостью и наполнением?

Пробовал, вызывать метод, но не получается. Вот например код для детали средства связи.

define("ContactCommunicationDetail", ["ContactCommunicationDetailResources", "terrasoft", "ViewUtilities", "Contact", "ConfigurationEnums", "ConfigurationConstants","MultiMaskEdit"],
    function(resources, Terrasoft, ViewUtilities, Contact, ConfigurationEnums, ConfigurationConstants,MultiMaskEdit) {
        return {
            entitySchemaName: "ContactCommunication",
 
            attributes: {
                "CommunicationTypes" : {
                    type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
                    dataValueType: Terrasoft.DataValueType.COLLECTION
                }
            },
            methods: {
                initCommunicationTypesFilters: function(esq) {
                    this.callParent(arguments);
                    var columns = Contact.columns;
                    if (columns !== null) {
                   //     debugger;
                        if(TypeStatus!='60733efc-f36b-1410-a883-16d83cab0980') {
                            if (columns.LinkedIn.usageType === ConfigurationEnums.EntitySchemaColumnUsageType.None) {
                                var InstagtramFilter = Terrasoft.createColumnFilterWithParameter(
                                    Terrasoft.ComparisonType.NOT_EQUAL, "Id", ConfigurationConstants.CommunicationTypes.Instagtram);
                                esq.filters.addItem(InstagtramFilter);
                                var OdnoklasnikiFilter = Terrasoft.createColumnFilterWithParameter(
                                    Terrasoft.ComparisonType.NOT_EQUAL, "Id", ConfigurationConstants.CommunicationTypes.Odnoklasniki);
                                esq.filters.addItem(OdnoklasnikiFilter);
                                var VkontakteFilter = Terrasoft.createColumnFilterWithParameter(
                                    Terrasoft.ComparisonType.NOT_EQUAL, "Id", ConfigurationConstants.CommunicationTypes.Vkontakte);
                                esq.filters.addItem(VkontakteFilter);
                            }
                        }
                    }
                }
            },
 
            diff: /**SCHEMA_DIFF*/[
 
 
            ]/**SCHEMA_DIFF*/
        };
    });

А что вам мешает использовать метод init()?

Владимир, а как вы предлагаете использовать init()?
Я пробовал в детали сделать так

  init:function(){
                    this.callParent(arguments);
                    this.initCommunicationTypesFilters();
                },
                updateDetail: function(config) {
                   this.callParent(arguments);
                   this.init();
 
                },

Но ничего путного не вышло.

Здравствуйте, Владислав!
Я, честно говоря, не совсем понял, как Ваш код должен работать. Возможно Вы не полностью предоставили фрагмент кода, но в условии происходит сравнение:

if(TypeStatus!='60733efc-f36b-1410-a883-16d83cab0980')
...

При этом я не вижу определения переменной TypeStatus. Рекомендую поставить там точку останова и посмотреть, какие условия выполняются.

Андрей, TypeStatus это переменная, которая присваивается в модуле ContactPageV2. При изменении статуса вызывается метод, где присваивается текущее значение статуса и вызывается метод updateDetails.После чего в модуле детали ContactCommunicationDetail и происходит проверка. Если условие выполняется добавляются фильтры, иначе они не добавляются.

attributes: {
            "Type": {
                dependencies: [
                    {
                        columns: ["Type"],
                        methodName: "typeChanged"
                    }
                ]
            }
        },
methods: {
  onEntityInitialized: function() {
                this.callParent(arguments);
                this.typeChanged();
            },
   typeChanged: function() {
       TypeStatus=this.get('Type').value;
         this.updateDetails();}

Сам метод отрабатывает верно, проверял в отладчике, все фильтры добавляются и удаляются, исходя из коллекции фильтров entitySchemaName. Но проблема не в этом, а в том что он работает, только при полной перезагрузке, а значит необходим какой-нибудь метод для обновления детали.

В какой момент Вы хотите обновлять деталь?

Владимир, после изменения поля типа контакта.

Попробуйте вместо this.updateDetail() вызвать this.updateDetail({reloadAll: true});

Иван, пробовал, но не работает. В итоге получилось сделать, но иначе. Воспользовался методом loadDetail в модуле NUI.BasePageV2.js. В карточке при изменении поля, взял часть этого метода и вызывал т.о.

this.sandbox.loadModule("DetailModuleV2", {
                            renderTo: "ContactPageV2ContactAddressContainer",
                            id: "SectionModuleV2_ContactSectionV2_CardModuleV2_detail_ContactAddress"
                        });

Ломухин Владислав Вячеславович,

я попробовал тоже самое, у меня пишет ошибку. но нужно тоже самое. подскажете как это сделать, может быть полный пример кода? спасибо

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