Ext LovCommboはEditor GredPanelに使う時、紛失問題の解決を選択します.

4272 ワード

LovCoboは、Extのux拡張で提供されるプルダウン多選択コントロールです.このコントロールが編集テーブルEditoridPanelに使用されると、ドロップダウンして複数のオプションを選択すると、選択したデータが失われます.インターネットで資料を探しましたが、解決策が見つからなくて、自分で分析するしかないです.問題解決過程において、王亮は大きな支持を与えました.ここで感謝します.別作の本文はこの問題の解決方法を記録して、みんなと共有して忘れたいです.        まず、問題の原因を説明します.LovCoboというコントロールは、Extの例において存在し、利用可能であるが、例としてはEditor GridPanelに使用されていないため、露出問題はない.このコントロールをEditor GridPanelに置くと、編集がフォーカスを落とし、Editor Grid上のEditorがastertValueという方法に呼び出されます.この方法はExtのコンボで、LovCommboはCommboから引き継いでいますが、この方法は上書きされていません.この方法の最後にthis.setValueを呼び出し、選択した複数のコントロールのオプションを表示名にカンマ区切りを付けてsetValueに伝えました.setValueは、カンマ区切りの表示値の文字列を認識できません.カンマ区切りのvalue文字列だけをサポートします.運転後に入ってきたパラメータは解読できないと判断し、コントロールに空の値を設定しました.選択したオプションがなくなりました.        この問題を解決するには、いくつかの案があります.個人は比較的直接的なものを選んだ.コンボの中のastertValueをLovCommboに上書きする方法は、カンマ分割の表示値をsetValueに伝えないようにして、カンマ分割のvalue値に伝えます.        ExtのLovCompbo類コードを修正して、中に下記のコードを入れます.
    //    :        grid  ,grideditor   combobox      。          setvalue ,      。  
        ,assertValue : function(){  
            var val = this.getRawValue(),  
                rec,arr_rec,i=0;  
            //   value   ,   rec  
            var arr_val = val.split(this.separator);  
            var arr_value = this.value.split(this.separator);  
            for(;i<arr_val.length;i++){  
                if(this.valueField && Ext.isDefined(arr_value[i])){  
                    rec = this.findRecord(this.valueField, arr_value[i]);  
                }  
                if(!rec || rec.get(this.displayField) != arr_val[i].trim()){  
                    rec = this.findRecord(this.displayField, arr_val[i].trim());  
                }  
                if(rec && !arr_rec){  
                    arr_rec = [];  
                }  
                if(rec){  
                    arr_rec.push(rec);  
                }  
            }  
            if(!arr_rec && this.forceSelection){  
                if(val.length > 0 && val != this.emptyText){  
                    this.el.dom.value = Ext.value(this.lastSelectionText, '');  
                    this.applyEmptyText();  
                }else{  
                    this.clearValue();  
                }  
            }else{  
                if(arr_rec && this.valueField){  
                    // onSelect may have already set the value and by doing so  
                    // set the display field properly.  Let's not wipe out the  
                    // valueField here by just sending the displayField.  
                    if (this.value == val){  
                        return;  
                    }  
                    i = 0;  
                    val = "";  
                    var ival;  
                    for(;i<arr_rec.length;i++){  
                        ival = arr_rec[i].get(this.valueField);  
                        if(!ival){  
                            ival = arr_rec[i].get(this.displayField);  
                        }  
                        if(i ==0 ){  
                            val = ival;  
                        }else{  
                            val = val+","+ival;  
                        }  
                    }  
                }  
                this.setValue(val);  
            }  
        } 

         複数選択なので、まず入ってきたvalue値文字列を分離して、それぞれ彼らのrecordを見つけて、その中からvalue値を取って文字列をつづり合わせて、setValueに渡します.他の影響を与えないように、コード修正はできるだけcompboの中のastertValue方法の元のコードロジックを維持します.         このコードがあればLovCoboは正常にEditor GredPanelで使用できます.本論文は著者本人がitEyeに転載したもので、原文:http://www.oecp.cn/hi/slx/blog/1168441はこの文書を提供する機構はOECPコミュニティであり、更に多くのブログ記事はOECPコミュニティまで閲覧できる.この文書の添付ファイルは皆様の転載を歓迎します.文章の作者の許可を得る前に、文章の内容や著作権情報を変更してはいけません.