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

1

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

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

selected поле имеет тип boolean. Я создал класс виджетов, расширяющий класс 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 просто исчез из древовидного изображения...)?

  • 0
    Пожалуйста, предоставьте ваш шаблон и / или код виджета, чтобы я мог дать вам правильный ответ
  • 0
    Я обновил свой вопрос, чтобы показать весь код JS и Qweb.
Теги:
odoo
odoo-10
qweb

1 ответ

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');

            });
        }
    });

});
  • 0
    Ваш ответ звучит хорошо, я все еще должен попробовать, хотя, когда я это сделаю, я дам вам свой отзыв;)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню