Как выполнить какое-либо действие с узлом после его загрузки в javascript в odoo?

Сделал новый виджет для поля Char. Я наследую его шаблон от оригинального Char:

<t t-name="FieldRed" t-extend="FieldChar">
    <t t-jquery="input" t-operation="attributes">
        <attribute name="id">barcode_input</attribute>
        <attribute name="class">o_form_input bg-red</attribute>
    </t>
</t>

Затем я только пытаюсь заполнить поле некоторым текстом, когда оно загружено (я знаю, что могу сделать это без использования JavaScript, но мне нужно управлять этим, чтобы начать с моей реальной цели). Итак, я сделал это:

var FieldRed = widget.FieldChar.extend({
    template: 'FieldRed',
    events: _.extend({}, widget.FieldChar.prototype.events, {
        'load': 'on_load',
        'ready': 'on_ready',
        'keypress': 'on_keypress',
    }),

    init: function (field_manager, node) {
        console.log('INIT');
        this._super(field_manager, node);
        this.$el.parent().find('input').val('INIT');
    },

    on_load: function (e) {
        console.log('LOAD');
        this.$el.parent().find('input').val('LOAD');
    },

    on_ready: function (e) {
        console.log('READY');
        this.$el.parent().find('input').val('READY');
    },

    on_keypress: function (e) {
        console.log('KEYPRESS');
        this.$el.parent().find('input').val('KEYPRESS');
    },
})

Прежде всего, я ожидал найти элемент input в this.$el, но он есть в this.$el.parent(), потому что из-за того, что элемент input объявлен в исходном шаблоне?

И мой главный вопрос: я могу автоматически заполнить текст узла input на keypress, но та же строка кода не работает в методе init, ни события load, ни ready. Как я могу заполнять текст узла input каждый раз, когда пользователь открывает форму, содержащую поле с моим виджетом?

0
0
305
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я могу использовать метод start, который также вызывается автоматически. Это происходит после вызова init и willStart, затем визуализируется представление и после этого вызывается start. Это хорошо объясняется в официальной документации в разделе «Жизненный цикл виджета»:

https://www.odoo.com/documentation/11.0/reference/javascript_reference.html

When the rendering is complete, the framework will automatically call the start method. This is useful to perform some specialized post-rendering work. For example, setting up a library.

Must return a deferred to indicate when its work is done.

Поэтому мне нужно было только унаследовать от исходного метода start и добавить свои функции:

start: function() {
    console.log('START');
    this._super.apply(this, arguments);
    this.$el.parent().find('input').val('START');
},

Другие вопросы по теме