Javascript ExtJS4.2-FieldContainer内的字段始终标记为脏。

Javascript ExtJS4.2-FieldContainer内的字段始终标记为脏。,javascript,forms,extjs,extjs4,extjs4.2,Javascript,Forms,Extjs,Extjs4,Extjs4.2,你好。我有一个web应用程序,用户在其中填写多个表单。然后可以编辑这些表单,我希望通过获取表单中的所有脏字段并在数据库中记录名称和值,将编辑记录在我的数据库中,并以审计跟踪的形式记录下来 起初,我有一个问题,单选按钮有相同的名称,因为他们被标记为肮脏,但我最终设法解决了这个问题。但是,我现在的问题是FieldContainer中的字段。即使我将它们取消标记为脏字段,当我运行检查脏字段的代码时,FieldContainer中的字段也会标记为脏字段 以下是我在预加载表单时运行的代码,以使我的按钮干净

你好。我有一个web应用程序,用户在其中填写多个表单。然后可以编辑这些表单,我希望通过获取表单中的所有脏字段并在数据库中记录名称和值,将编辑记录在我的数据库中,并以审计跟踪的形式记录下来

起初,我有一个问题,单选按钮有相同的名称,因为他们被标记为肮脏,但我最终设法解决了这个问题。但是,我现在的问题是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条件检查元素是否是单选按钮,如果是,我只是将其标记为clean。第二个if语句检查元素是否为字段容器。如果是这样,我将选中字段容器中的所有子视图元素,并查找复选框、文本字段和组合框,然后将它们标记为干净。这是我从中得到的控制台日志:

itemID of field in fieldContainer = amountFinanced
component dirty state = false
itemID of field in fieldContainer = unitTerm
component dirty state = false
我用我的视图进行了反检查,这些是正确的itemid,它们被标记为clean

现在,我点击按钮创建审计跟踪记录。一般的想法是,我获取活动表单,遍历字段并检查哪些字段是脏的。这是我的密码:

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);
                        }
                    }
                }
            });
        }
    }
});
这个比上一个长一点。我首先检查表单中的所有视图元素,然后过滤我使用的所有元素X类型。如果我遇到一些不是字段容器的内容,我会检查它是否脏,如果脏,我会获取字段的名称和值,并将其放入数组中,稍后保存到数据库中。但是,如果它是一个字段容器,我会检查该字段容器中的元素,检查它们是否脏,然后保存它们

现在。我还记录项目ID以及fieldcontainer中字段的名称。我检查了是否将字段集中的字段标记为与加载表单时一样干净会有所帮助。但是,在检查控制台的日志时,我看到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,导航到字段amountField-textfield和unitTerm-comboBox,获取它们的名称,并查看它们是否脏

现在我很困惑,我能够在前面将这些字段标记为干净,为什么当我继续检查所有脏字段时,它们现在被标记为脏字段,即使我没有更改任何内容

是否有更好的方法检查字段容器和字段集内的字段是否脏?我已经被这个问题困扰了好几个小时了,现在我越来越沮丧


谢谢你的帮助。

好吧,我是个白痴。所述字段集从另一个控制器初始化,因为值取自另一个存储/数据库表。我必须在控制器中运行下面的代码,从存储中获取值并将其加载到表单中

但是,在我的另一个包含字段集的表单中,似乎您必须运行此代码,以确保它们不会每次都标记为脏的,即使没有进行任何更改:

form.items.filterBy(function(c){

    if(c.getXType()==='radiofield'){
        c.originalValue = c.getValue();
        c.checkDirty();
    }
    if(c.getXType()==='fieldcontainer'){
        c.items.filterBy(function(d){
            if(d.getXType()==='checkboxfield' || d.getXType()==='textfield' ||
               d.getXType()==='combobox'){ //add whatever XType you have inside

                console.log("itemID of field in fieldContainer = " + d.getItemId());
                console.log("component dirty state before = " + d.isDirty());

                console.log("original value = " + d.originalValue);
                console.log("get value = " + d.getValue());
                console.log("get raw value = " + d.getRawValue());


                d.originalValue = d.getValue();
                d.checkDirty();

                console.log("component dirty state after = " + d.isDirty());


            }
        });
    }

});
当然,您可以删除控制台日志