0

私は Dojo を初めて使用し、次の問題に直面しています。

spring roo によって生成された次のフォーム選択があります。

<div id="_f_trc_suivi_domain_Pli_conteneurNum_id">
            <label for="_conteneurNum_id">Conteneur Num : </label>
            <select id="_conteneurNum_id" name="conteneurNum">
            <option value="">Tous</option>
                <option value="1">951</option>
                <option value="2">753</option>
                <option value="3">753159</option></select><br />
            <script type="text/javascript">
                Spring.addDecoration(new Spring.ElementDecoration({
                    elementId : '_conteneurNum_id',
                    widgetType : 'dijit.form.FilteringSelect',
                    widgetAttrs : {
                        hasDownArrow : true
                    }
                }));
            </script>
        </div>

その結果、firebug で次のようになります。

    <div wairole="combobox" dojoattachpoint="comboNode"
        id="widget__conteneurNum_id"
        class="dijit dijitReset dijitInlineTable dijitLeft dijitTextBox dijitComboBox dijitTextBoxError dijitComboBoxError dijitError"
        role="combobox" widgetid="_conteneurNum_id"
        aria-labelledby="_conteneurNum_id_label" aria-expanded="false">
        <div dojoattachevent="onmousedown:_onArrowMouseDown"
            wairole="presentation" dojoattachpoint="downArrowNode"
            class="dijitReset dijitRight dijitButtonNode dijitArrowButton dijitDownArrowButton dijitArrowButtonContainer"
            role="presentation">
            <input type="text" wairole="presentation" readonly="" tabindex="-1"
                value="? " class="dijitReset dijitInputField dijitArrowButtonInner"
                role="presentation">
        </div>
        <div class="dijitReset dijitValidationContainer">
            <input type="text" wairole="presentation" readonly="" tabindex="-1"
                value="? "
                class="dijitReset dijitInputField dijitValidationIcon dijitValidationInner"
                role="presentation">
        </div>
        <div class="dijitReset dijitInputField dijitInputContainer">
            <input type="text" waistate="haspopup-true,autocomplete-list"
                wairole="textbox" dojoattachpoint="textbox,focusNode"
                dojoattachevent="onkeypress:_onKeyPress,compositionend"
                autocomplete="off" class="dijitReset dijitInputInner"
                role="textbox" aria-haspopup="true" aria-autocomplete="list"
                id="_conteneurNum_id" tabindex="0" aria-required="true"
                aria-invalid="true" value="" aria-owns="_conteneurNum_id_popup"><input
                type="hidden" name="conteneurNum" value="">
        </div>
    </div>

残念ながら、値が「Tous」である空白のオプションの上に常に白いオプションが表示されます。

次の gif を参照してください。

結果のフォームフィールド

私が間違っているのは何ですか?どんな手がかりも歓迎します。

編集:問題がこれにあることは確かです:<option value="">Tous</option>特にそのvalue=""部分。質問を次のように言い換えて絞り込むことができます: Dojo/Dijit がこれを適切に処理するようにするにはどうすればよいですvalue=""か??

4

2 に答える 2

0

MyEclipse 2014、Spring 3.1、および古い Dojo/Dijit バージョンと数時間格闘した後、回避策を見つけました。これが古いことはわかっていますが、MyEclipse はこれらの古いバージョンのすべてをパックし、1 つを狂わせます。

FilteringSelect、null 値での選択、値での html オプション、およびプロジェクトの残りの部分を台無しにする dojo ライブラリの置き換えを試みました。だから、誰かを助けることができれば、これをここに投稿します:

このケースは、'-- Select item --' のような null 値を持つダミーのプロンプト オプションが必要な場合によく見られます。MyEclipse で spring-js-2.3.1.RELEASE にパックされた Dojo/dijit バージョンは、オプションを null 値に置き換え、ドロップダウン リストに表示されるセパレーターを使用します。Dojo/Dijit の最後のいくつかのバージョンでは、Craig Swing のフィドルでわかるように、この動作は修正されているようです。

バインドするプロパティが文字列でない場合は、null の代わりにダミー オプションの値として単一のエスケープを割り当てることができます。これは、後でコントローラーで null としてバインドされるため、ダミー オプションが表示されるためです。元:

<option selected="selected" value="">Tous</option>

ただし、プロパティが文字列の場合、このようにして、コントローラーのプロパティに不要な空白が見つかります。

そこで、最終的に Select.js を直接変更することにしました

プロジェクトの webapps/resources/dijit/form/Select.js に配置します。次の行にコメントを付けます。

/*
if(!_1.value){
return new dijit.MenuSeparator();
}else{
*/
var _2=dojo.hitch(this,"_setValueAttr",_1);
var _3=new dijit.MenuItem({option:_1,label:_1.label,onClick:_2,disabled:_1.disabled||false});
dijit.setWaiRole(_3.focusNode,"listitem");
return _3;
/*
}
*/

また、web.xml で Resource Servlet のこのパスをオーバーライドすることを忘れないでください。

<servlet-mapping>
    <servlet-name>My Servlet</servlet-name>
    <url-pattern>/resources/dijit/form/Select.js</url-pattern>
</servlet-mapping>
于 2014-08-17T12:46:44.407 に答える