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

时间:2014-10-07 15:23:18

标签: javascript forms extjs extjs4 extjs4.2

美好的一天。我有一个Web应用程序,用户填写了几个表单。然后可以编辑这些表单,我想通过获取表单中的所有脏字段并将namevalue记录在数据库中。

最初,我遇到了具有相同名称的Radio Buttons的问题,因为它们被标记为脏,但我最终设法解决了这个问题。不过,我现在的问题是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

我使用我的View进行了计数器检查,这些是正确的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);
                        }
                    }
                }
            });
        }
    }
});

这比前一个更长。我首先浏览表单中的所有视图元素,然后过滤掉我使用的所有元素XTypes。如果我遇到一些不是字段容器的东西,我会检查它是否脏,如果它是脏的,我会取出字段的namevalue并将其放入一个数组中(稍后我会保存到我的数据库)。但是,如果它是一个字段容器,我检查该字段容器中的元素以检查它们是否是脏的然后我将保存它们。

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

现在我很困惑,我之前能够将这些字段标记为干净,为什么当我继续检查所有脏字段时,即使我没有改变任何东西,它们现在也被标记为脏了?

有没有更好的方法来检查字段容器(和字段集)中的字段是否脏了?我已经被这个问题困住了几个小时了,而且让我感到沮丧。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

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

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

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


            }
        });
    }

});

当然,您可以删除控制台日志。