3

これはトリッキーで、なぜこのように機能するのか理解できません:

<p:dataList var="item" value="#{recb.friends}" type="definition">
    <p:column>
        <h:form>
            <p:remoteCommand name="getTaste" process="@this" 
                         actionListener="#{item.calculateTaste( recb.username )}"
                         autoRun="true" oncomplete="poll.start()" />    
            <p:poll autoStart="false" update="@form" interval="1"
                widgetVar="poll" oncomplete="poll.stop()" />                    
        </h:form>
    </p:column>
</p:dataList>

したがって、私が期待しているのは、それぞれに対してメソッドITEMを呼び出すことcalculateTasteです。何が起こるか: の最後のアイテムに対してのみ、1 つの呼び出ししかありませんdataList

何が悪いのかアイデアが尽きます。IDが生成されるように列を追加しましたが、まだ機能していません:(。

4

1 に答える 1

5

問題の原因に関しては、この構成はgetTaste、基本的に次のように、同じスコープ内でまったく同じ名前の複数のJS変数を生成します。

<script>var getTaste = function() { ... }</script>
<script>var getTaste = function() { ... }</script>
<script>var getTaste = function() { ... }</script>
...

それらは基本的に宣言された順序で互いにオーバーライドしており、getTaste()DOMレディで呼び出すと、基本的に最後のものが実際に呼び出されます。これは、観察している症状と完全に一致します(生成されたHTMLソースを右クリックして自分で見ると、ブラウザーの[ソースの表示]でもそのことがわかります)。

それぞれに一意のJS変数名を付けます。varStatusの属性を利用して<p:dataList>、特にメソッドとともに現在の反復ステータスを取得できますgetIndex()

<p:dataList ... varStatus="loop">
    ...
    <p:remoteCommand name="getTaste#{loop.index}" ... /> 

このようにして、生成されたコードは一意のJS変数名になります。

<script>var getTaste0 = function() { ... }</script>
<script>var getTaste1 = function() { ... }</script>
<script>var getTaste2 = function() { ... }</script>
...

ちなみに私も同じ解決策を適用します<p:poll widgetVar>

<p:dataList ... varStatus="loop">
    ...
    <p:remoteCommand name="getTaste#{loop.index}" ...
        oncomplete="poll#{loop.index}.start()" /> 
    <p:poll ...
        widgetVar="poll#{loop.index}" oncomplete="poll#{loop.index}.stop()" />
于 2013-01-07T17:26:24.497 に答える