Выберите значение поля выбора из javascript в odoo 12 - PullRequest
1 голос
/ 15 февраля 2020

Я хочу выбрать значение поля выбора, используя javascript или jquery в odoo 12. Например, у меня есть значение выбора из javascript Я хочу выбрать или установить значение поля выбора. Для этого я пишу следующий код:

var type_option = result['type'];
$('.select_question select').find('option[value="free_text"]').show();
$('.select_question select').val('option[value="free_text"]');          
$('.select_question select').val(type_option);
$('.select_question select').text(type_option);

Но в поле выбора значение не выбрано. Может кто-нибудь, пожалуйста, помогите.

Обновление

var FieldMany2ManyTags = relationalField.FieldMany2ManyTags.include({   
    supportedFieldTypes: ['selection'],
    events: _.extend({}, relationalField.FieldMany2ManyTags.prototype.events, {
        'click .badge': '_onClickTag',
    }),

    _onClickTag: function(event){
        event.preventDefault();
            event.stopPropagation();
        var self = this;
        var id = $(event.target).parent().data('id');

        var data = this._rpc({
            model: 'survey.survey',
            method: 'get_id',
            args: [id],
        }).then(function (result) { 


            //Display Question In question field
            $('.question_class').val(result['question']);   

            //Show selection field
            var type_option = result['type'];//selection field value
            var type_option = result['type'];
            $('.select_question select').find('option[value="free_text"]').show();
            $('.select_question select').val('option[value="free_text"]');          
            $('.select_question select').val(type_option);
            $('.select_question select').text(type_option);             


            //For check Box 
            $('.mandatory_class .custom-control-input input').val(result['constr_mandatory']);

            if(result['constr_mandatory'] === true){

                 var $checkbox = $('.custom-control-input');
                         $checkbox.prop('checked', true);

                if ($checkbox.is(':checked')) {
                            $('.mandatory_msg_class').val(result['constr_error_msg']);
                    $('.o_form_label').show();                  
                    $('.mandatory_msg_class').show();       
                     }
            }else{

                var $checkbox = $('.custom-control-input');
                         $checkbox.prop('checked', false);
                if ($checkbox.not(':checked')) {                                    
                    $('.mandatory_msg_class').hide();           
                     }//close if
            }

        });

        return data;

    },
});//close FieldMany2ManyTags

enter image description here

1 Ответ

1 голос
/ 17 февраля 2020

Чтобы обновить значение поля, вам нужно вызвать событие Odoo field_change, передавая идентификатор записи, который вы хотите изменить, и поле, которое будет изменено вместе с некоторыми опциями для других полей:

    // this is the widget object
    this.trigger_up('field_changed', 
                    dataPointID: this.dataPointID,
                    changes: changes, // change is an object {field_name: value, other_field_name: value}
                    viewType: this.viewType});

Это событие обрабатывается BasicModel в конце для обновления каждой записи.

В вашем примере все сложнее, потому что вы хотите go из поля вашего one2many в родительскую модель, к сожалению, в У виджета поля вопроса у нас нет идентификатора родительской записи, только идентификатор модели страницы или как там называется. поэтому я использовал новое пользовательское событие odoo (я назвал его badge_clicked) для обработки его из родительского виджета (One2many field widget), в этом виджете у нас есть идентификатор родительской записи. Надеюсь, что комментарии проясняют для вас вещи:

/*
   Handle event trigged by the method that handle the badge click event
*/
FieldX2Many.include({
    custom_events: _.extend({}, FieldX2Many.prototype.custom_events, {
          badge_clicked: '_OnBadgeClicked',
    }),
    _OnBadgeClicked : function(ev){
        // do this only in edit mode
        if (this.mode != 'edit')
                return undefined;

        var result = ev.data.result; 
        var changes = {};
        // this will trigger an update on the field it self,
        // odoo will wait for the type of operation

        //Display Question In question field ( I don't know the field names)
        // Very Big Note: the values must be valid you cannot give an interger value to char field for example
        changes['field_name'] = result['question'];
        changes['some_other_field'] = result['some_ther_field_to_set'];
        // if you want to check some field of the current record don't use JQuery to retrieve the value use the record attribute of the widget.
        // if (this.record.data['some_field'] === 'some_value'){
        //        do some thing
        // }      

        // this is required(a dummy update to avoid unexpected behavior by the field_changed event)
        changes[this.name] = {
                operation: 'UPDATE',
                id: ev.data.dataPointID,
                changes: {} };


        // we did all of this just to trigger the field_changed from the One2many field because in the many2many tags we don't have the ID of the parent record.
        this.trigger_up('field_changed', {
            dataPointID: this.dataPointID,  // here the ID is the parent(global) record
            changes: changes,
            viewType: this.viewType});
     },
});

/*
   Handle click event to inform the parent widget.
*/
FieldMany2ManyTags.include({
    events: _.extend({}, FieldMany2ManyTags.prototype.events, {
        'click .badge': '_onClickTag',
    }),
     _onClickTag: function(event){
            var self = this;
            event.preventDefault();
            event.stopPropagation();
            // deactivate this for other model.
            // I tried the same thing with account.invoice and it worked perfectly
            // I don't know the name of the model in your one2many field in my case is invoice.line ^^
            if (self.model != 'account.invoice.line')
                return undefined;
            var self = this;
        var id = $(event.target).parent().data('id');

        var data = this._rpc({
            model: 'survey.survey',
            method: 'get_id',
            args: [id],
        }).then(function (result) { 
           // trigger an event that will be handled by the parent widget
           self.trigger_up('badge_clicked', {
                result: result,
                // when we click the One2many field in edit mode, a field_change will be trigger
                // we need the ID of this record to trigger a dummy update
                dataPointID: self.dataPointID,  // here the ID is the record in the line of one2many field and we don't have the ID of the parent record at this point this why we are triggering this event to be handled by the one2many
           });
        }
     },
});

Примечание : я попробовал это, и это сработало отлично. Я изменил поле comment модели счета, нажав на теги tax Идея состоит в том, чтобы вызвать событие Odoo из обработчика события click и обработать это событие у родительского виджета-ведьмы one2many, чтобы иметь возможность вызвать событие field_change, используя правильный ID. Я надеюсь, вам это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...