如何修改Odoo 8中的Backbone JS功能?

时间:2017-02-06 10:38:59

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

我想在Odoo 8(模块point_of_sale)中修改JS代码的一部分。原始代码就是这个:

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 数据参数中):

<?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);

    },
});

}

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

instance.point_of_sale.Order.set不是函数

有人可以帮助我吗?

2 个答案:

答案 0 :(得分:2)

你可以这样试试。

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);

        },
    });
}

答案 1 :(得分:0)

试试这个:

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);

  },
});