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