仅包含特定视图类型的 javascript 代码

include a javascript code only for a certain view type

我只想在用户为 res.partner 模型创建记录或更新记录时添加 javascript 代码。

我已经尝试使用这种技术包含一个 javascript 文件(我将在下面解释它的作用):

<odoo>
    <data>
        <template id="my_module_script" name="my module script" inherit_id="web.assets_backend">
            <xpath expr="." position="inside">
                <script type="text/javascript" src="/my_module/static/src/js/script.js"></script>
            </xpath>
        </template>
    </data>
</odoo>

效果很好,我的 javascript 文件现在包含在内...但在任何视图中(不仅是我的特定合作伙伴 create/update 视图)。

问题

有什么方法可以告诉 odoo 为特定的视图类型加载特定的 javascript(或 css 文件)(我想在这个例子中 javascript 为 base.view_partner_form 视图加载的文件)?

哦...听起来很糟糕。别担心,我们会尽力解决它。 :)

1) 你只需要在模型的js中创建一个构造函数。像这样:

new instance.web.Model("res.partner").call()

在调用方法中,您可以调用任何 python 方法,或者也可以调用您的视图。

2) 您也可以通过将 url 传递给您的 js 文件来执行此操作。一种行动 url。像这样

action_url = _.str.sprintf('/web?db=%s#id=%s&view_type=form&model=res.parnter', db, meeting_id);

3) 另一种方法是传递动作。 Whrn url 被重定向到那个,然后这个动作从 js 被调用。

on_follower_clicked: function  (event) {
        event.preventDefault();
        var partner_id = $(event.target).data('partner');
        var state = {
            'model': 'res.partner',
            'id': partner_id,
            'title': this.record_name
        };
        session.webclient.action_manager.do_push_state(state);
        var action = {
            type:'ir.actions.act_window',
            view_type: 'form',
            view_mode: 'form',
            res_model: 'res.partner',
            views: [[false, 'form']],
            res_id: partner_id,
        }
        this.do_action(action);
    },

4) 您还可以通过 this.model 获取当前模型 这将 return 当前模型也 new instance.web.Model(self.dataset.model) 获取当前数据集模型。

您也可以为此参考基本代码。所有这些方法都有很多示例。

如果包含 javascript 文件,每次安装模块时都会将其编译为 web.assets_backend.js

并且 web.assets_backend.js 在每次加载后端页面时加载,而不是在加载视图时加载。

Odoo 被设计成 SPA。 javascript 个文件在第一页加载时加载。

所以我认为这不应该通过这种方式完成(将自定义 js 添加到视图),而是通过 Odoo 的方式:通过特定操作触发代码。