Добрый день.

Проблема с обновлением грида детали после добавления элемента в деталь. Элемент не появляется в гриде сразу после выбора.

1. Выбор элементов в детали реализован с помощью LookupUtilities:

        var lookupConfig = {
                entitySchemaName: "BankingService",
                columnName: "Name",
                columns: ["ClientType"],
                multiSelect: true,
                filters: filters
        };
           
        LookupUtilities.ThrowOpenLookupMessage(
            sandbox,
            lookupConfig,
            this.addBankingServiceItemsCallback,
            this,
            this.getCardModuleSandboxId()
        );

2. Собственно callback-функция для обработки выбора пользователя:

                this.methods.addBankingServiceItemsCallback = function(args) {
                        if (!args || args.selectedRows.getCount() === 0) {
                                return;
                        }
                       
                        var selectedIds = args.selectedRows.getKeys();
                        var synchronizedRule = this.filterValue;
                        var batchQuery = Ext.create('Terrasoft.BatchQuery');
                        Terrasoft.each(selectedIds, function(item) {
                                var insert = Ext.create('Terrasoft.InsertQuery', {
                                        rootSchemaName: this.entitySchema.name
                                });
                                var newGuid = Terrasoft.generateGUID();
                                insert.setParameterValue(
                                        'Id',
                                        newGuid,
                                        Terrasoft.DataValueType.GUID
                                );
                                insert.setParameterValue(
                                        'BankingService',
                                        item,
                                        Terrasoft.DataValueType.GUID
                                );
                                insert.setParameterValue(
                                        'SynchronizedRule',
                                        synchronizedRule,
                                        Terrasoft.DataValueType.GUID
                                );
                                batchQuery.add(insert);
                        }, this);
                        batchQuery.execute();
                        sandbox.publish('DetailChanged', {detailName: this.entitySchema.name}, [this.getSenderSandboxId()]);
                };

3. Обработчик события DetailChanged на странице редактирования объекта с деталью:

                this.methods.detailChangedSubscriber = function(args) {
                        viewModel.reloadDetail(args.detailName + 'Detail');
                };

Однако, после нажатия кнопки "Выбрать", выбранные записи в гриде детали не отображаются. Если нажать "Сохранить" на странице редактирования объекта и потом открыть заново этот объект для редактирования, то в детали выбранные записи видны.

Как обновить грид детали, чтобы выбранные элементы отображались непосредственно после выбора?

Заранее благодарен за помощь!

Нравится

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

Добрый день Артем!!!

уточните пожалуйста версию и конфигурацию BPMOnline. Спасибо!!!

"Власов Михаил Викторович" написал:

Добрый день Артем!!!

уточните пожалуйста версию и конфигурацию BPMOnline. Спасибо!!!

Михаил, версия 7.2; конфигурация вроде "lending"

Здравствуйте, я не воссоздавал на тестовом примере batchQuery, это не суть вопроса, сразу менял данные детали в базе данных, через sql management studio. Самое главное здесь в вашем вопросе, это вызов «viewModel.reloadDetail(args.detailName + 'Detail');»

Во-первых, выполните отладку, и убедитесь что метод вызывается, если нет, копайте в сторону песочницы, и того что бы ваши id песочницы совпадали. И добейтесь того что бы в функцию detailChangedSubscriber все же заходило.

Во-вторых, почему viewModel? Данный метод же есть прямо в главном скоупе страницы. Я закешировал для теста скоуп страницы в инит методе:

structure.userCode = function() {
   this.methods.init = function() {
      document.scp = this;
   };
};

И вот видно наш метод для обновления детали:

Во вторых, имя, передаваемое как аргумент должно соответствовать именно «name» свойству детали, а не «schemaName». Вот, к примеру, деталь опыта работы контакта:

И вот такой её вызов, отлично обновляет содержимое грида:

document.scp.reloadDetail("contactCareer");

где «document.scp» по сути this скоуп страницы контакта.

Вывод: Отладьте метод, проверьте имена.

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