Как выполнить какое-то действие при нажатии на поле дерева в Odoo 10? - PullRequest
0 голосов
/ 19 октября 2018

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

<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 просто исчезал из представления дерева ...)?

1 Ответ

0 голосов
/ 29 октября 2018

Я думаю, что вы тут все путаете.А может и нет.Просто чтобы быть ясно, виджеты столбцов предназначены только для отображения информации.Например, чтобы ваш персонализированный 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');

            });
        }
    });

});
...