【问题标题】:Getting new value when ajax re-rendersajax 重新渲染时获取新值
【发布时间】:2012-07-14 22:10:00
【问题描述】:

我的代码运行良好,但我真的无法清楚地理解它。

谁能解释一下。

这是我的代码:

<script type="text/javascript">
    var portletNamespace = '#<portlet:namespace/>\\:formId\\:';
    $(portletNamespace + 'drpCategory').live('change', function () {
        alert('#{myController.simpleString}');
        $(portletNamespace + 'hiddenValue').ready(function () {
            alert($(portletNamespace + 'hiddenValue').val());
        });
    });
</script>

<h:inputText id="hiddenValue" value="#{myController.simpleString}" />

<h:selectOneMenu id="drpCategory">
    <f:selectItem itemLabel="Chọn thủ tục" itemValue="#{null}" />
    <f:selectItems value="#{myController.listCate}" var="item" itemLabel="#{item.cateNane}"
    itemValue="#{item.cateId}" />
    <f:ajax event="valueChange" render="hiddenMap " listener="#{myController.changeCategory}"
    />
</h:selectOneMenu>

在我更改drpCategory 中的项目后,javascript 首先警告空字符串,然后警告simpleString 的实际值。但是如果我删除第一个警报代码,第二个将显示旧值(在由 ajax 渲染之前)

例如,如果我删除第一个警报代码。首先,hiddenValue 为空,更改drpCategory 值,hiddenValue 更改为'a' 但javascript 警报为空,第二次更改drpCategory 然后hiddenValue 更改为'b' 但它仍然会显示'a'.

编辑: 啊,我发现了,我改成了:

 <script type="text/javascript">
    var portletNamespace = '#<portlet:namespace/>\\:formId\\:';     
    $(portletNamespace+'drpCategory').live('change', function(){
        setTimeout('myFunc()', 500);    

    });

    function myFunc(){
            $(portletNamespace+'hiddenValue').ready(function(){
                alert($(portletNamespace+'hiddenValue').val());
            });
    }
   </script> 

【问题讨论】:

    标签: javascript jquery ajax jsf-2 liferay


    【解决方案1】:

    如果我理解你的场景是正确的..

    改变你的

    <f:ajax event="valueChange" render="hiddenMap " listener="#{myController.changeCategory}"
    />
    

    进入

    <f:ajax onevent="callThisMethodAfterValueIsUpdated" event="valueChange" render="hiddenMap " listener="#{myController.changeCategory}"
    />
    

    在你的 js 中添加这个

    var portletNamespace = '#<portlet:namespace/>\\:formId\\:'; 
    function callThisMethodAfterValueIsUpdated(data) {
        if (data.status === 'success') {
            alert($(portletNamespace+'hiddenValue').val());
        }
    }
    

    依赖setTimeout 是错误的,因为它可能会不时改变服务器/流量...

    【讨论】:

    • ak :D 非常感谢,我花了很多时间寻找解决方案
    • 嗯,我使用 jQuery 将文本添加到 但是当验证失败时我丢失了文本,你有什么方法可以在验证失败后恢复文本:-?
    • 嗯...您始终可以使用f:ajaxonevent 再次设置它,该按钮由调用您的字段验证的按钮触发...但我认为您最好更改您的逻辑而不是寻找解决方法......
    • 实际上,我想要这样的东西:当我输入输入文本时,使用 jQuery 绑定 keyup 事件并将该文本设置为跨度。仅用于视图层,表单提交后我不需要它,但是这个跨度文本在第一次验证失败后消失(奇怪的是第二次验证失败它仍然存在?
    • stackoverflow.com/questions/11539544/…这里有新问题^^,再次感谢您
    猜你喜欢
    • 1970-01-01
    • 2021-09-02
    • 2013-08-16
    • 2016-12-30
    • 2018-08-12
    • 2019-06-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-02
    相关资源
    最近更新 更多