0

私のコードは正常に機能していますが、実際にははっきりと理解できていません。

誰かが私を説明してもらえますか?

これは私のコードです:

<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。しかし、最初のアラートコードを削除すると、2番目のアラートコードに古い値が表示されます(ajaxによってレンダリングされる前)

たとえば、最初のアラートコードを削除した場合。最初hiddenValueは空で、drpCategory値をhiddenValue変更します'a'が、javascriptアラートは空です。2回目に変更するとdrpCategoryhiddenValue変更され'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> 
4

1 に答える 1

0

私があなたのシナリオを正しく理解していれば..

あなたの

<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サーバー/トラフィックによって時々異なる可能性があるため、依存するのは間違っています...

于 2012-07-16T06:08:56.933 に答える