【问题标题】:ExtJS4.2 - Fields inside of FieldContainer is always marked dirty.ExtJS4.2 - FieldContainer 内的字段始终标记为脏。
【发布时间】:2014-10-07 15:23:18
【问题描述】:

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

最初,我遇到了同名单选按钮的问题,因为它们被标记为脏,但我最终设法解决了这个问题。然而,我现在的问题是 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。如果我遇到不是字段容器的东西,我会检查它是否脏,如果它脏了,我会将字段的namevalue 放入一个数组中(稍后我将保存到我的数据库中) )。但是,如果它是一个字段容器,我会检查该字段容器中的元素以检查它们是否脏,然后我会保存它们。

现在。我还记录了项目 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


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-06-11
      • 1970-01-01
      • 2018-06-02
      • 1970-01-01
      • 1970-01-01
      • 2021-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多