Проблема с Dojo / Dijit и пустой опцией при выборе формы

Я новичок в 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="" ??


person balteo    schedule 27.07.2012    source источник
comment
используйте dijit.form.Select вместо FilteringSelect   -  person Ravi Khakhkhar    schedule 27.07.2012
comment
Я действительно подумал об этом, но я хотел бы понять, почему возникает эта проблема и как этот компонент работает, особенно учитывая, что, когда в выборе нет пустой опции, выбор отображается правильно.   -  person balteo    schedule 27.07.2012
comment
вы пробовали установить значение для 1-го варианта? Также почему бы не установить data-dojo-type напрямую, как здесь? ‹Select data-dojo-type = dijit.form.FilteringSelect id = fruit name = fruit› ‹значение параметра = AP› Apples ‹/option› ‹значение параметра = OR selected› Oranges ‹/option› ‹значение параметра = PE› Pears ‹/Option› ‹/select›   -  person unludo    schedule 27.07.2012
comment
Привет, Unludo, к весне мой выбор украшен додзё, и мне нужно нулевое значение для первого варианта ... Есть еще идеи?   -  person balteo    schedule 27.07.2012
comment
Можете ли вы просто попробовать без весеннего декора, а скорее без атрибута data-dojo-ype?   -  person unludo    schedule 27.07.2012
comment
К сожалению, очень невозможно добавить этот атрибут в мою форму Spring: выберите тег ...   -  person balteo    schedule 27.07.2012
comment
Моя ошибка!! Это возможно. Я постараюсь разместить здесь сообщение соответственно.   -  person balteo    schedule 27.07.2012
comment
Я попытался добавить data-dojo-type="dijit.form.FilteringSelect, но, похоже, Firefox не улавливает его, и мой выбор отображается как простое поле ...   -  person balteo    schedule 27.07.2012
comment
вы также можете попробовать удалить параметр с пустым значением и посмотреть, работает ли он. Для этого варианта вы также можете попробовать вообще без атрибута значения.   -  person unludo    schedule 27.07.2012
comment
Что касается первого пункта: он отлично работает, если убрать вариант с пустым атрибутом. Что касается второго пункта, к сожалению, невозможно удалить атрибут value с помощью пружинной формы.   -  person balteo    schedule 27.07.2012
comment
можно взломать, добавив javascript?   -  person unludo    schedule 27.07.2012
comment
<script type="text/javascript"> dojo.require('dojo/dom'); dojo.ready(function remAttr(){ dojo.removeAttr('theId', 'value'); } ); </script> приводит к ошибке "Не удалось загрузить дом"; последняя попытка '../ dom.js'` Есть идеи?   -  person balteo    schedule 27.07.2012
comment
почему бы не попытаться поставить value = NULL и не управлять конкретным случаем?   -  person unludo    schedule 27.07.2012
comment
Что касается удаления атрибута value, я открыл еще один пост, на который вы любезно ответили. Я дам вам знать, каков будет результат, когда я заработаю.   -  person balteo    schedule 30.07.2012
comment
@Unludo. Теперь я понимаю, что невозможно удалить атрибут value из тега <option..., потому что Dojo / Spring уже изменил выбор на что-то другое (см. Второй листинг кода в сообщении выше). Есть еще идеи?   -  person balteo    schedule 31.07.2012
comment
@balteo Вы можете использовать методы addOption, removeOption в diji.form.select для управления параметрами. Вы получаете доступ к dijit через dijit.byId (_conteneurNum_id)   -  person unludo    schedule 31.07.2012
comment
@Unludo Хороший вопрос. Я пробовал, но не работает. см. здесь: jsfiddle   -  person balteo    schedule 31.07.2012
comment
@balteo попробуйте это jsfiddle.net/jpJwN Щелкните один из вариантов при первом выборе, чтобы добавить пустое значение   -  person unludo    schedule 31.07.2012
comment
Я систематически получаю _1 _?!?   -  person balteo    schedule 31.07.2012
comment
у вашей скрипки есть выбор, который не является диджитом.   -  person unludo    schedule 31.07.2012
comment
Я имею в виду, что в моем локальном приложении не скрипка.   -  person balteo    schedule 31.07.2012
comment
Это означает, что когда вы выполняете эту команду, _conteneurNum_id не является dijit.   -  person unludo    schedule 31.07.2012
comment
Понятно ... Однако я почти уверен, что настроил это как диджит.   -  person balteo    schedule 31.07.2012


Ответы (2)


Просто введите значение 0, как ожидалось. У меня нет проблем со следующим кодом:

<div id="_f_trc_suivi_domain_Pli_conteneurNum_id">
        <label for="_conteneurNum_id">Conteneur Num : </label>
        <select id="_conteneurNum_id" name="conteneurNum">
            <option value="0">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>
person user3896769    schedule 31.07.2014

Я только что нашел обходной путь после нескольких часов борьбы с MyEclipse 2014, Spring 3.1 и старыми версиями Dojo / Dijit, я знаю, что это старый, но MyEclipse упаковывает эти старые версии всего и сводит с ума.

Я попробовал FilteringSelect, Select с нулевым значением, html option со значением и заменой библиотек dojo, которые испортили остальную часть проекта. Я отправлю это здесь, если это кому-нибудь поможет:

Этот случай является обычным, если вы хотите, чтобы в вашем выборе была пустая опция приглашения, например «- Выбрать элемент -» с нулевым значением. Версия Dojo / dijit, упакованная с MyEclipse в spring-js-2.3.1.RELEASE, заменяет параметр с нулевыми значениями с разделителями, показанными в раскрывающемся списке. В нескольких последних версиях Dojo / Dijit это поведение, кажется, исправлено, как вы можете видеть на скрипке Craig Swing.

Если свойство, которое вы привязываете, не является строкой, вы можете назначить один espace как значение фиктивной опции вместо null, потому что позже будет привязано как null в контроллере, поэтому будет отображаться фиктивный вариант. Бывший:

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

Но если свойство является String, таким образом вы обнаружите нежелательное пустое пространство в свойстве в вашем контроллере.

Итак, я наконец решил напрямую изменить 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:

<servlet-mapping>
    <servlet-name>My Servlet</servlet-name>
    <url-pattern>/resources/dijit/form/Select.js</url-pattern>
</servlet-mapping>
person No DBComparer    schedule 17.08.2014