【问题标题】:How to modify Backbone JS function in Odoo 8?如何在 Odoo 8 中修改 Backbone JS 功能?
【发布时间】:2017-02-06 10:38:59
【问题描述】:

我想修改 Odoo 8 中的一段 JS 代码(模块point_of_sale)。原代码是这样的:

function openerp_pos_models(instance, module){
    ...
    module.Order = Backbone.Model.extend({
        ...
        addPaymentline: function(cashregister) {
            var paymentLines = this.get('paymentLines');
            var newPaymentline = new module.Paymentline({},{cashregister:cashregister, pos:this.pos});
            if(cashregister.journal.type !== 'cash'){
                newPaymentline.set_amount( Math.max(this.getDueLeft(),0) );
            }
            paymentLines.add(newPaymentline);
            this.selectPaymentline(newPaymentline);

        },
    });
}

我修改了该代码的一些行,并且更改按我的意愿工作(我只删除了if (cashregister.journal.type !== 'cash') 行)。问题是现在,我想从我制作的模块中以正确的方式修改这段代码。

为此,我添加了一个 JavaScript 文件,该文件从以下 XML 文件中调用(最后一个包含在我的 __openerp__.py data 参数中):

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

而JS文件的内容是:

openerp.nmx_pos_ext = function(instance) {

var _t = instance.web._t;

instance.point_of_sale.Order.include({
    addPaymentline: function(cashregister) {
        var paymentLines = this.get('paymentLines');
        var newPaymentline = new module.Paymentline({},{cashregister:cashregister, pos:this.pos});
        newPaymentline.set_amount( Math.max(this.getDueLeft(),0) );
        paymentLines.add(newPaymentline);
        this.selectPaymentline(newPaymentline);

    },
});

}

我更新了模块并且没有应用更改,我收到一个错误,因为 include 似乎在 Backbone 模型中不存在。我尝试使用set 而不是include,但我得到了同样的错误:

instance.point_of_sale.Order.set 不是函数

有人可以帮我吗?

【问题讨论】:

    标签: javascript xml backbone.js odoo-8 odoo


    【解决方案1】:

    你可以这样试试。

    openerp.nmx_pos_ext = function(instance) {
        var _t = instance.web._t;
    
        var _initialize_Order_ = instance.point_of_sale.Order.prototype;
        instance.point_of_sale.Order = instance.point_of_sale.Order.extend({
            initialize: function(attributes){
                _initialize_Order_.initialize.call(this,attributes);
            },
            addPaymentline: function(cashregister) {
                var paymentLines = this.get('paymentLines');
                var newPaymentline = new instance.point_of_sale.Paymentline(
                    {},
                    {
                        cashregister: cashregister,
                        pos: this.pos
                    }
                );
                newPaymentline.set_amount(
                    Math.max(this.getDueLeft(), 0)
                );
                paymentLines.add(newPaymentline);
                this.selectPaymentline(newPaymentline);
    
            },
        });
    }
    

    【讨论】:

    • 您的代码有效!! (通过简单的编辑)。非常感谢!!
    【解决方案2】:

    试试这个:

    instance.module.Order.include({
    addPaymentline: function(cashregister) {
        var paymentLines = this.get('paymentLines');
        var newPaymentline = new module.Paymentline({},{cashregister:cashregister, pos:this.pos});
        newPaymentline.set_amount( Math.max(this.getDueLeft(),0) );
        paymentLines.add(newPaymentline);
        this.selectPaymentline(newPaymentline);
    
      },
    });
    

    【讨论】:

    • 感谢您的回答。您的代码给出 "Cannot read property 'Model' of undefined" 错误。
    • 更新了我的答案。再试一次。
    • 我刚刚尝试了新代码,但我得到了与我在之前的评论中写的相同的错误。 @Viki Chavada 给出的解决方案目前似乎效果很好,我将尝试更多,只是为了检查该代码是否没有二次影响。也谢谢你。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-24
    • 1970-01-01
    • 1970-01-01
    • 2016-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多