Как выполнить какое-либо действие при нажатии на поле древовидной структуры в Odoo 10?

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

<field name="selected" widget="toggle_switch"/>

Поле selected имеет тип логическое. Я создал класс виджета, расширяющий класс Column:

var ListView = require('web.ListView');

var ToggleSwitch = ListView.Column.extend({
    template: 'ToggleSwitchSheet',
    events: {
        'click .slider': 'on_click',
    },

    init: function() {
        this._super.apply(this, arguments);
    },

    _format: function(row_data, options) {
        return QWeb.render(this.template, {
            'widget': this,
            'row_data': row_data,
            'prefix': session.prefix,
        });
    },
})

И зарегистрировал это так:

var core = require('web.core');
core.list_widget_registry.add('field.toggle_switch', ToggleSwitch);

Код шаблона:

<t t-name="ToggleSwitchSheet">
    <label class="switch">
        <t t-if="row_data['selected']['value']">
            <input type="checkbox" checked="checked"/>
        </t>
        <t t-if="!row_data['selected']['value']">
            <input type="checkbox"/>
        </t>
        <span class="slider round"></span>
    </label>
</t>

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

Проблема в том, что я не могу этого сделать. Кажется, что events словарь недоступен для класса Column, и я не могу использовать что-то вроде this.on('click', this, this.on_click); или this.$el.find(...), поскольку this приносит только данные field.

Может кто-нибудь мне помочь? Должен ли я наследовать от других классов, чтобы использовать события в моем виджете (на самом деле я пробовал, но в каждом случае мой шаблон Qweb просто исчезал из древовидного представления ...)?


person forvas    schedule 19.10.2018    source источник
comment
Пожалуйста, предоставьте свой шаблон и / или код виджета, чтобы я мог дать вам правильный ответ   -  person Axel Mendoza    schedule 22.10.2018
comment
Я обновил свой вопрос, чтобы показать весь код JS и Qweb.   -  person forvas    schedule 22.10.2018


Ответы (1)


Я думаю, что вы здесь смешиваете. А может и нет. Для ясности Виджеты столбцов предназначены только для отображения информации. Например, чтобы ваш персонализированный html-виджет правильно вписывался в список. Для выполнения действий есть кнопки действий, которые можно использовать для изменения значения записи модели в методе Python.

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

Было сказано, что ваш виджет почти такой же, как и виджет ColumnBoolean, но если вы хотите продолжить проделанную работу, я думаю, вы могли бы сделать это следующим образом:

odoo.define('listview_label_click', function (require) {
"use strict";

    var ListView = require('web.ListView');

    ListView.List.include({
        init: function (group, opts) {
            this._super.apply(this, arguments);
            this.$current.delegate('td label.switch', 'click', function (e) {
                e.stopPropagation();
                // execute your code here, like:
                var checked = $(e.currentTarget).find('input').prop('checked');

            });
        }
    });

});
person Axel Mendoza    schedule 29.10.2018
comment
Ваш ответ звучит хорошо, мне все еще нужно попробовать, когда я это сделаю, я дам вам свой отзыв;) - person forvas; 30.10.2018