问题描述
美好的一天,
我需要帮助来解决这个问题
问题:
我正在尝试设置一个自定义脚本,根据用户选择的年份计算用户的年龄,此外,当用户输入 first_name 、 last_name 、 middle_name 时,它应该反映在 full_name 上。
我已尽力编写代码,但它不起作用,对于那些怀着一颗金心阅读本文的人,请帮助我更正我的代码。
补充说明:我正在使用 Frappe 框架并在 Ubuntu 18.04.5 LTS 上运行
有关我在哪里创建自定义代码和文档类型 (client_details) 的其他信息
截图: https://drive.google.com/drive/folders/1556W7AeeLfaJuC2Fu8RbnI7sSZc4hXQZ?usp=sharing
非常感谢
frappe.ui.form.on('client_details',{
refresh: function(frm) {
var today = new Date();
var birthDate = new Date(brith_day);
var age = today.getFullYear() - birthDate.getFullYear(); var m = today.getMonth() - birthDate.getMonth();
if (m < 0 || (m === 0 && today.getDate() < birthDate.getDate())) {
age--;
} return age;
}
refresh: function(frm){
var first_name = first_name
var last_name = last_name
var full_name = first_name.concat(last_name)
return full_name;
}
});
解决方法
代码中有两个问题
- 使用
return
而不是 set_value 进行输出 - 使用多个刷新事件。由于key相同,最后一个生效。
使用此代码在 fullname
事件中设置 age
和 refresh
的值
frappe.ui.form.on('client_details',{
refresh: function(frm) {
var today = new Date();
// this is how you get data from form
var birthDate = new Date(frm.doc.brithday);
var age = today.getFullYear() - birthDate.getFullYear(); var m = today.getMonth() - birthDate.getMonth();
if (m < 0 || (m === 0 && today.getDate() < birthDate.getDate())) {
age--;
}
// use frm.set_value to set value of a field
frm.set_value('age',age);
// getting data from form
var first_name = frm.doc.firstname
var last_name = frm.doc.lastname
var full_name = firstname.concat(lastname)
// setting fullname in form
frm.set_value('fullname',full_name);
}
});
以上代码将在 fullname
事件的 age
和 refresh
字段中进行更改。如果您需要实时更改,可以使用以下代码。在 brithdate
上设置事件以更改 age
,在 firstname
和 lastname
上设置事件以更改 fullname
。
frappe.ui.form.on('client_details',{
brithday: function(frm) {
var today = new Date();
// this is how you get data from form
var birthDate = new Date(frm.doc.brithday);
var age = today.getFullYear() - birthDate.getFullYear(); var m = today.getMonth() - birthDate.getMonth();
if (m < 0 || (m === 0 && today.getDate() < birthDate.getDate())) {
age--;
}
// use frm.set_value to set value of a field
frm.set_value('age',age);
},firstname: function(frm) {
// getting data from form
var first_name = frm.doc.firstname
var last_name = frm.doc.lastname
var full_name = firstname.concat(lastname)
// setting fullname in form
frm.set_value('fullname',full_name);
},lastname: function(frm) {
// getting data from form
var first_name = frm.doc.firstname
var last_name = frm.doc.lastname
var full_name = firstname.concat(lastname)
// setting fullname in form
frm.set_value('fullname',full_name);
}
});
最好将 age
和 fullname
字段保留为 readonly
,因为它们是 computed
并且不会是用户输入。