Spring元素装饰和Ajax事件装饰与Diljit不兼容?

时间:2011-09-06 08:40:26

标签: spring dojo spring-webflow spring-js

我使用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>

目的是根据下拉列表中选择的内容呈现表单的第二部分。这可以通过下拉列表的onChange上的AJAX调用来实现,或者在noscript的情况下实现 - 按下“选择”按钮。

事物的noscript方面有效。我在下拉列表中选择了一些内容,然后按“选择”,表单的其余部分将在刷新时呈现。

但是,AJAX调用在其请求中没有刚刚选择的值。就好像在Dijit组件更新其表示之前发生了AJAX调用。这些组件是否与我使用它们的方式兼容?

如果符合以下条件我可以使用

  1. 我不会将组件装饰为Dijit组件,而只是使用onclick AJAX装饰进行正常下拉。
  2. 我把AJAX调用放在一个按钮而不是Dijit onChange

1 个答案:

答案 0 :(得分:0)

面对同样的问题,它的解决方法是在隐藏字段中设置所选值,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>