Как убедиться, что проверка поля Sugar имеет достаточно времени для запуска - PullRequest
0 голосов
/ 03 апреля 2019

Я пытаюсь создать проверку поля в модуле Opportunity, который выдаст ошибку, когда пользователь попытается изменить этап фиксации с «Upside» или «Commit» обратно на «Funnel». Функция проверки в record.js запускается, когда пользователь пытается сохранить отредактированную возможность. Он сравнивает выбранный этап фиксации с этапом фиксации, сохраненным в базе данных для возможности. Выдается ошибка проверки, если выбранный этап фиксации - «Воронка», а сохраненный этап фиксации - «Перевернутый» или «Фиксация». Когда выдается ошибка проверки, поле этапа фиксации должно быть выделено, и должно отображаться всплывающее окно с сообщением об ошибке.

Код проверки в record.js выглядит следующим образом:

initialize: function (options) {
    this._super('initialize', [options]);
    app.error.errorName2Keys['check_commit_stages'] = 'ERROR_CHECK_COMMIT_STAGES';
    this.model.addValidationTask('check_commit_stages', _.bind(this._doValidateCommitStages, this));
},

_doValidateCommitStages: function(fields, errors, callback) {
    console.log('Validating commit stages in record.js');

    let CommitStageSelected = this.model.get('commit_stage_c');
    let OpportunityId = this.model.get('id');
    let OpportunityBean = app.data.createBean('Opportunities');
    OpportunityBean.set('id', OpportunityId);
    let CommitStageSaved = '';
    OpportunityBean.fetch({success: function(model, data){
            CommitStageSaved = OpportunityBean.get('commit_stage_c');
            console.log('selected commit stage: ' + CommitStageSelected);
            console.log('saved commit stage: ' + CommitStageSaved);

            let SavedStageUpsideOrCommit = 
            ("Upside" == CommitStageSaved || "Commit" == CommitStageSaved);

            if ("Funnel" == CommitStageSelected && SavedStageUpsideOrCommit) {
                errors['commit_stage_c'] = errors['commit_stage_c'] || {};
                errors['commit_stage_c'].check_commit_stages = true;

                app.alert.show('message-id', {
                    level: 'error',
                    messages: 'Commit Stage cannot be changed from Upside or from Commit to Funnel',
                    autoClose: false
                });
            }

            callback(null, fields, errors);
    }});
},

Проблема в том, что после проверки возможности выдается ошибка проверки. Я получаю всплывающее окно «Успех» с надписью «Сохранено», затем я получаю всплывающее окно «Ошибка» с сообщением об ошибке проверки. Поле стадии фиксации не выделяется.

Я предполагаю, что задача проверки выполняется слишком долго, возможно, из-за функции OpportunityBean.fetch, поэтому запись сохраняется до того, как задача проверки успела выдать ошибку. Есть ли способ отложить сохранение или ускорить получение данных из компонента? Или проблема в чем-то совершенно ином?

Ответы [ 2 ]

1 голос
/ 04 апреля 2019

Я думаю, вы также можете попробовать этот подход для задачи, которую вы пытаетесь выполнить

({
extendsFrom: 'OpportunitiesRecordView',

initialize: function (options) {
    this._super('initialize', [options]);
    app.error.errorName2Keys['check_commit_stages'] = 'ERROR_CHECK_COMMIT_STAGES';
    this.model.addValidationTask('check_commit_stages', _.bind(this._doValidateCommitStages, this));
},

_doValidateCommitStages: function(fields, errors, callback) {
    console.log('Validating commit stages in record.js');

    let CommitStageSaved = this.model.getSynced('commit_stage_c');
    let CommitStageSelected = this.model.get('commit_stage_c');

    console.log('selected commit stage: ' + CommitStageSelected);
    console.log('saved commit stage: ' + CommitStageSaved);

    let SavedStageUpsideOrCommit = 
    ("Upside" == CommitStageSaved || "Commit" == CommitStageSaved);

    if ("Funnel" == CommitStageSelected && SavedStageUpsideOrCommit) {
        errors['commit_stage_c'] = errors['commit_stage_c'] || {};
        errors['commit_stage_c'].check_commit_stages = true;

        app.alert.show('message-id', {
            level: 'error',
            messages: 'Commit Stage cannot be changed from Upside or from Commit to Funnel',
            autoClose: false
        });
    }

    callback(null, fields, errors);
}, })

Используя этот подход, вам даже не нужно извлекать компонент Opportunities для получения сохраненных данных из базы данных.

0 голосов
/ 08 апреля 2019

Спасибо всем респондентам!Единственное, что сработало для меня, это:

let changedFields = this.model.changedAttributes(this.model.getSynced());
let CommitStageSaved = changedFields.commit_stage_c;

Когда я попробовал подход в ответе @Sheikh Rahat Ali, я получил CommitStageSaved = undefined.Когда я попробовал подход @ Jay и ограничил функцию выборки только полем commit_stage_c, у меня возникла та же проблема с записью, сохраняемой до запуска проверки.Я узнал о функции changedAttributes из ответа на мой вопрос на форуме разработчиков Sugar.

...