包含仅适用于特定视图类型的JavaScript代码

时间:2018-01-12 13:41:20

标签: javascript odoo odoo-11

我想仅在用户创建记录或更新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文件现已包含在内......但在任何视图中(不仅适用于我的特定合作伙伴创建/更新视图)。

问题

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

2 个答案:

答案 0 :(得分:1)

哦......听起来很糟糕。不用担心我们会尝试解决它。 :)

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

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

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

2)你也可以通过将url传递给你的js文件来做到这一点。一种动作网址。喜欢这个

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

3)另一种方法是通过行动。当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获取当前模型这将返回当前模型new instance.web.Model(self.dataset.model)获取当前数据集模型。

您也可以为此引用基本代码。所有这些方法都有很多例子。

答案 1 :(得分:1)

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

每次加载后端页面时都会加载web.assets_backend.js,而不是在加载视图时加载。{/ p>

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

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