【问题标题】:It is possible to inherit a function and add a code line in JS可以继承一个函数,在JS中添加一行代码
【发布时间】:2020-07-10 09:28:00
【问题描述】:

我正在尝试在创建的 JS 函数中添加代码行,但我无法在尝试继承该函数的事件中间注入。

例如,我有这个变量:var my_new_var = $(this).val().toString();

这是已经定义好的代码,我需要在参数中注入我的新变量:{} 字典:

odoo.define('portal.signature_form', function (require){
    "use strict";
    // vars and requires

    var SignatureForm = Widget.extend({
        template: 'portal.portal_signature',
        events: {
            'click #o_portal_sign_clear': 'clearSign',
            'click .o_portal_sign_submit': 'submitSign',
            'init #o_portal_sign_accept': 'initSign',
        },
 // init sign and clear sign events

        submitSign: function (ev) {
            ev.preventDefault();

            var self = this;
            var $confirm_btn = self.$el.find('button[type="submit"]');

            var partner_name = self.$("#o_portal_sign_name").val();
            var signature = self.$("#o_portal_signature").jSignature('getData', 'image');
            var is_empty = signature ? this.empty_sign[1] === signature[1] : true;

            this.$('#o_portal_sign_name').parent().toggleClass('o_has_error', !partner_name).find('.form-control, .custom-select').toggleClass('is-invalid', !partner_name);
            this.$('#o_portal_sign_draw').toggleClass('bg-danger text-white', is_empty);
            if (is_empty || ! partner_name) {
                return false;
            }

            $confirm_btn.prepend('<i class="fa fa-spinner fa-spin"></i> ');
            $confirm_btn.attr('disabled', true);

            return rpc.query({
                route: this.options.callUrl,
                params: {
                    'res_id': this.options.resId,
                    'access_token': this.options.accessToken,
                    'partner_name': partner_name,
                    'signature': signature ? signature[1] : false,
// ****************** HERE I NEED TO ADD MY NEW LINE **************************
                    'my_new_var': my_new_var,
                },
            }).then(function (data) {
                self.$('.fa-spinner').remove();
                if (data.error) {
                    self.$('.o_portal_sign_error_msg').remove();
                    $confirm_btn.before(qweb.render('portal.portal_signature_error', {message: data.error}));
                    $confirm_btn.attr('disabled', false);
                }
                else if (data.success) {
                    $confirm_btn.remove();
                    var $success = qweb.render("portal.portal_signature_success", {widget: data});
                    self.$('#o_portal_sign_draw').parent().replaceWith($success);
                }
                if (data.force_refresh) {
                    if (data.redirect_url) {
                        window.location = data.redirect_url;
                    } else {
                        window.location.reload();
                    }
                }
            });
        },
...
});

 

有人知道如何添加这个新代码行吗?

【问题讨论】:

  • 通过普通继承我不认为你可以,我正在寻找类似的东西我没有找到解决方案,当我使用调试时我发现请求立即发送到服务器此时我决定完全重写该函数,幸运的是 Odoo 在 return 语句中返回了类的实例,所以我重写了该属性并且继承流程没有中断。我所做的是猴子补丁
  • 所以如果我理解可以做到吗?如果只是通过覆盖所有代码并调用我的新代码?如果可能的话,我该怎么做(禁用现有代码并启用我的新代码)?感谢您的回复! @CharifDZ

标签: javascript odoo odoo-12


【解决方案1】:

为了使您的扩展程序正常工作,您需要导入您的脚本。为此,您必须扩展 odoo 加载所有要使用的 JS 的 XML 文件。这是一个例子:

<?xml version="1.0" encoding="utf-8"?>
<odoo>
 <data>
  <template id="assets_backend" name="my app extended assets" inherit_id="web.assets_backend">
   <xpath expr="." position="inside">
    <script type="text/javascript" src="/my_project/static/src/js/my_new_script.js"/>
   </xpath>
  </template>
 </data>
</odoo>

为确保您的代码正常工作,请尝试添加断点("debugger;" 或 alert("debug");)并检查您的浏览器开发工具是否在此处停止。

要在 Odoo 中编辑现有的小部件方法,您需要导入小部件并使用“包含”属性来编辑现有代码。举个例子:

odoo.define('your_module.some_name', function (require) {
    "use strict";

    var OdooWidget = require('odoo_module.OdooWidget');

    OdooWidget.include({
        name_widget_method: function () {
            // current code
            // your code
            // current code
            // ...
        }
    });
});

我希望这会有所帮助!

【讨论】:

  • 我知道您是指使用此代码添加一个新的 js 文件,该文件的功能完全被覆盖? @阿隆索
  • 是的。此外,您必须继承小部件。我将编辑我的答案以添加一些指导方针。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-23
  • 2020-01-09
  • 2022-11-16
  • 2013-03-15
  • 1970-01-01
  • 2012-05-19
  • 1970-01-01
相关资源
最近更新 更多