在 Odoo 16 中创建 One2many 小部件时出错

问题描述 投票:0回答:1

想法很简单,我想以有序列表的形式展示one2many中的所有数据:

就这么简单。应该这么简单,但我已经浪费了10个小时,仍然没有成功的迹象:(

这是我的js:

odoo.define('obki.accordion_widget', function (require) {
    'use strict';

    var core = require('web.core');
    var AbstractField = require('web.AbstractField');
    var field_registry = require('web.field_registry');
    var QWeb = core.qweb;

    var AccordionWidget = AbstractField.extend({
        // The template for the widget
        template: 'AccordionWidget',
        supportedFieldTypes: ['one2many'],
        // Render the widget
        _render: function () {
            var info = this.value;
            console.log('######### info: ', info);
            debugger; //it's not even executed
            this.$el.text('Accordion Widget Content'); // Display the Accordion name
        },
    });

    // Register the widget
    field_registry.add('accordion_widget', AccordionWidget);

    // return AccordionWidget;

    return {
        AccordionWidget: AccordionWidget,
    };
});

这是我的 XML:

<t t-name="AccordionWidget" owl="1">
    <ol>
    <t t-foreach="record.tac_ids" t-as="line">
        <li>
            <div><t t-esc="line.name"/></div>
        </li>
    </t>
    </ol>        
</t>

结果始终是:“缺少小部件:文本类型字段的 Accordion_widget”

我尝试从另一个 3rd_party 插件复制另一个代码,如下所示:

/** @odoo-module **/
import { registry } from '@web/core/registry';
import { X2ManyField } from '@web/views/fields/x2many/x2many_field';

export class Accordion extends X2ManyField {
}

Accordion.template = 'AccordionWidget';
registry.category('fields').add('accordion_widget', Accordion);

看起来工作正常,小部件已注册并显示在表单上。但不幸的是,我不知道如何访问数据。如何读取field_ids数据?我已经尝试过 this.field_ids、props.field_ids、props.record、props.everything,但没有任何效果。

请帮忙...:')

odoo owl odoo-16
1个回答
0
投票

one2many 行应该可以使用以下方式访问:

this.props.value.records

错误是从遗留字段注册表引发的,请尝试以下代码(第一个示例已升级):

组件:

/** @odoo-module **/

import { registry } from "@web/core/registry";
import { Component } from "@odoo/owl";

const fieldRegistry = registry.category("fields");


export class AccordionWidget extends Component {

}

AccordionWidget.template = "AccordionWidget"
AccordionWidget.supportedTypes = ["one2many"];

// Register the widget
fieldRegistry.add('accordion_widget', AccordionWidget);

模板:

<t t-foreach="this.props.value.records" t-as="line" t-key="line_index">
   <li>
       <div><t t-esc="line.data.name"/></div>
   </li>
</t>

t-key
属性为必填项

© www.soinside.com 2019 - 2024. All rights reserved.