Spring ElementDecoration и AjaxEventDecoration несовместимы с Dijit?
Я использую Spring 3.0.5, Webflow 2.3.0 и Spring JS для украшения.
Одна из моих форм имеет следующий код:
<form:select path="selection">
<form:option value="" label="Please select"></form:option>
<form:options></form:options>
</form:select>
<noscript>
<button id="btnSelect" type="submit" name="_eventId_dropDownSelectionChange">Select</button>
</noscript>
<script type="text/javascript">
Spring.addDecoration(new Spring.ElementDecoration({
widgetType : "dijit.form.Select",
widgetAttrs : {
forceWidth : true,
missingMessage : "<s:message code="NotEmpty" />",
}
}));
Spring.addDecoration(new Spring.AjaxEventDecoration({
elementId : "selection",
formId : "templateModel",
event : "onChange",
params : { _eventId: "dropDownSelectionChange" }
}));
</script>
Намерение состоит в том, чтобы визуализировать вторую часть формы в зависимости от того, что выбрано в раскрывающемся списке. Это должно быть достигнуто либо с помощью вызова AJAX onChange раскрывающегося списка, либо в случае noscript - нажатием кнопки "Выбрать".
Noscript сторона вещей работает. Я выбираю что-то в выпадающем меню, нажимаю "Выбрать", и остальная часть формы отображается при обновлении.
Однако вызов AJAX не имеет только что выбранного значения в своем запросе. Это как если бы вызов AJAX происходил до того, как компонент Dijit обновил свое представление. Совместимы ли эти компоненты так, как я их использую?
Я могу заставить его работать, если:
- Я не украшаю компонент как компонент Dijit, а вместо этого просто обычный выпадающий список с художественным оформлением AJAX.
- Я ставлю вызов AJAX на кнопку вместо Dijit onChange
1 ответ
Столкнулся с той же проблемой, и обходной путь для нее - установка выбранного значения в скрытом поле, а Spring.AjaxEventDecoration позаботится обо всем остальном.
<input id="vehicleType" name="vehicleType" type="hidden" />
<select id="selectVehicle">
<c:forEach var="vehicle" items="${vehicleTypes}">
<option value="${vehicle.type}"><fmt:message key="${vehicle.description}" /></option>
</c:forEach>
</select>
</p>
<script type="text/javascript">
Spring.addDecoration(new Spring.ElementDecoration({
elementId : 'selectVehicle',
widgetType : "dijit.form.Select",
widgetAttrs : {
value : "${vehicleType}",
onChange : function(newValue){
document.getElementById('vehicleType').value=dijit.byId('selectVehicle').get('value');}
}
}));
Spring.addDecoration(new Spring.AjaxEventDecoration({
elementId : "selectVehicle",
formId : "quote",
event : "onChange",
params : {
_eventId : "dropDownVehicleSelectionChange",
fragments : "body"
}
}));
</script>