【发布时间】:2014-10-07 15:23:18
【问题描述】:
美好的一天。我有一个 Web 应用程序,用户填写几个表格。然后可以编辑这些表单,我想通过获取表单中的所有脏字段并将name 和value 记录在数据库中,以审计跟踪的形式在我的数据库中记录编辑。
最初,我遇到了同名单选按钮的问题,因为它们被标记为脏,但我最终设法解决了这个问题。然而,我现在的问题是 FieldContainer 中的字段。即使我将它们取消标记为脏,当我运行检查脏字段的代码时,FieldContainer 内的字段也会被标记为脏。
这是我在预加载表单时运行的代码,以使我的按钮变得干净:
form.items.filterBy(function(c){
if(c.getXType()==='radiofield'){
c.originalValue = c.getValue();
c.checkDirty();
}
else{
}
if(c.getXType()==='fieldcontainer'){
c.items.filterBy(function(d){
if(d.getXType()==='checkboxfield' || d.getXType()==='textfield' ||
d.getXType()==='combobox'){
console.log("itemID of field in fieldContainer = " + d.getItemId());
d.originalValue = d.getValue();
d.checkDirty();
console.log("component dirty state = " + d.isDirty());
}
});
}
});
我的函数所做的是遍历表单的每个子视图元素。如您所见,我有两个 if 条件。我的第一个 if 条件检查元素是否是单选按钮,如果是,我将其标记为干净。第二个 if 语句检查元素是否是字段容器。如果是这样,我检查字段容器中的所有子视图元素,并查找复选框、文本字段和组合框,然后将它们标记为干净。这是我从中得到的控制台日志:
itemID of field in fieldContainer = amountFinanced
component dirty state = false
itemID of field in fieldContainer = unitTerm
component dirty state = false
我用我的视图进行了反查,这些是正确的 itemID,它们被标记为干净。
现在,我在单击按钮时创建我的审计跟踪记录。一般的想法是我得到活动表单,浏览字段并检查哪些是脏的。这是我的代码:
form2.items.filterBy(function(c){
if(c.getXType()==='radiofield' || c.getXType() ==='combobox' ||
c.getXType()==='radiogroup' || c.getXType() ==='textfield' ||
c.getXType()==='datefield' || c.getXType() ==='fieldset' ||
c.getXType()==='fieldcontainer' || c.getXType() ==='checkbox' ){
if(c.getXType()!='fieldcontainer'){
if(c.isDirty()){
var entry = '';
if(c.getXType()==='radiofield'){
entry = c.getName() + ": " + c.getSubmitValue();
}
else{
entry = c.getName() + ": " + c.getRawValue();
}
changes.push(entry);
}
}
else{
c.items.filterBy(function(d){
if(d.getXType()==='radiofield' || d.getXType() ==='combobox' ||
d.getXType()==='radiogroup' || d.getXType() ==='textfield' ||
d.getXType()==='datefield' || d.getXType() ==='fieldset' ||
d.getXType()==='fieldcontainer' || d.getXType() ==='checkbox' ){
if(d.getXType()!='fieldcontainer' && d.getXType()!='label'){
console.log("item id = " + d.getItemId());
console.log("item name = " + d.getName());
console.log("component dirty state = " + d.isDirty());
if(d.isDirty()){
var entry = '';
if(d.getXType()==='radiofield'){
entry = d.getName() + ": " + d.getSubmitValue();
}
else{
entry = d.getName() + ": " + d.getRawValue();
}
changes.push(entry);
}
}
}
});
}
}
});
这比上一个要长一些。我首先浏览表单内的所有视图元素,然后过滤我使用的所有元素 XType。如果我遇到不是字段容器的东西,我会检查它是否脏,如果它脏了,我会将字段的name 和value 放入一个数组中(稍后我将保存到我的数据库中) )。但是,如果它是一个字段容器,我会检查该字段容器中的元素以检查它们是否脏,然后我会保存它们。
现在。我还记录了项目 ID 以及字段容器内的字段名称。我检查了将字段集中的字段标记为干净(就像我在加载表单时所做的那样)是否会有所帮助。但是,在检查控制台的日志时,我看到 fieldcontainer 中的字段被标记为脏,即使我没有更改它们。这是我的日志:
item id = amountField
item id = amountFinanced
item name = AMOUNT_FINANCED
component dirty state = true
item id = termField
item id = unitTerm
item name = TERM
component dirty state = true
如您所见,我能够浏览字段容器(分别为 amountField 和 termField),导航到字段(amountFinanced - 文本字段和 unitTerm - 组合框),获取它们的名称,并查看它们是否脏.
现在我很困惑,我之前能够将这些字段标记为干净,为什么当我继续检查所有脏字段时,即使我没有更改任何内容,它们现在也被标记为脏?
是否有更好的方法来检查字段容器(和字段集)内的字段是否脏?我已经被这个问题困扰了几个小时了,我感到很沮丧。
感谢您的帮助。
【问题讨论】:
标签: javascript forms extjs extjs4 extjs4.2