2017-06-21 37 views
3

我迄今已是基本的代码:如何在Odoo JavaScript中打开某些表单视图并更改其字段?

odoo.define('partner_data.res_partner_widget', function(require) { 
"use strict"; 

    var core = require('web.core'); 
    var Dialog = require('web.Dialog'); 
    var form_common = require('web.form_common'); 
    var Widget = require('web.Widget'); 

    var Model = require('web.Model'); 

    var _t = core._t; 
    var QWeb = core.qweb; 

    console.log('JS loaded'); 

    $(document).on('ready', function() { 
     console.log('Doc is ready'); 
     $('#FIELD').on('change', function() { 
      // Change value of other fields in this form 

     }); 
    }); 
}); 

问题是整个ODOO系统文件准备好触发器。并试图通过其名称$(#fieldname)找到该字段根本不起作用。

对于这个问题,是否有解决ODOO的具体问题?或者,也许你知道非常好的文档或例子,解释ODOO FIELD的变化方法。附:我写了ODOO,因为每个人都回答简单的JQuery风格,这不仅仅是简单的JQuery,它必须是更具体的与ODOO相关的东西。 或者,也许我可以在字段更改后调用特定窗体视图的Python函数,类似的东西。我发现的所有odoo文档都只提供很少或根本没有关于此的信息。

UPDATE:

感谢@Vishal Khichadiya我有点接近。我通过创建一个小部件来编辑他的答案。现在,当我将这个小部件设置为随机场时,让我们对一些不可见的字段说一下,我可以在任何我想要的字段上使用class class_partner,它将触发onchange方法。

odoo.define('partner_data.res_partner_widget', function(require) { 
"use strict"; 

var base = require('web_editor.base'); 
var options = require('web_editor.snippets.options'); 
var core = require('web.core'); 
var Dialog = require('web.Dialog'); 
var session = require('web.session'); 
var form_common = require('web.form_common'); 
var Widget = require('web.Widget'); 

var Model = require('web.Model'); 

var _t = core._t; 
var QWeb = core.qweb; 

var onchange_js_method_test = form_common.AbstractField.extend({ 
    start: function() { 
     this._super(); 
     var self = this; 
     $('body').on('change', '.class_partner', function() { 
      console.log('start triggered'); 
      console.log(self) 
      // Change value of other fields in this form 
      //you can call python function from here to set your value 
     }); 
    } 
}); 
core.form_widget_registry.add('onchange_js_method_test', onchange_js_method_test); 
}); 

XML:

<field name="random_invisible" " widget="onchange_js_method_test"/> 
<field name="on_this_field_onchange_triggers" class="class_partner"/> 
+1

您应该将java标记更改为javascript。尽管他们的名字是他们不相关的编程语言。 –

+0

你为什么试图在那里发起一个onchange事件(JS)?你的目标是什么? – CZoellner

+0

每当#FIELD值发生变化时,我需要更改其他字段的值,并且如果您希望建议我使用Python来做到这一点,否则它不会工作。 – enigmq

回答

1

首先你需要设置类属性的XML代码到Python提交的。 例如:

<field name="partner_id" class="class_partner" /> 

那么你需要这个JS中,也可以添加这个js文件assets_backend。

odoo.define('partner_data.res_partner_widget', function(require) { 
    "use strict"; 

     var core = require('web.core'); 
     var Dialog = require('web.Dialog'); 
     var form_common = require('web.form_common'); 
     var Widget = require('web.Widget'); 

     var Model = require('web.Model'); 

     var _t = core._t; 
     var QWeb = core.qweb; 
     var my_widget = Widget.extend({ 
      start: function() { 
       this._super(); 
       var self = this; 
       $('body').on('change', '.class_partner',function() { 
        // Change value of other fields in this form 
        //you can call python function from here to set your value 
       }); 
      }, 
     }); 
     core.action_registry.add('my_widget', my_widget); 
     return my_widget; 
    }); 
+0

您好,感谢您的回答@Vishal Khichadiya,我得到这个错误:“Uncaught SyntaxError:在严格模式代码中,函数只能在顶层或块内声明。”我猜测开始:函数必须进入一些东西,可能是另一个函数,正如我在源代码中看到的,它们在Widget中使用。延长或上课,延长 – enigmq

+0

我已修复它。 对不起,这是我的错误。 –

+0

注意到一些事情,这种方法不会触发many2one领域(可能many2many和one2many以及),任何想法我怎么能实现这一点? – enigmq

相关问题