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方法。发生的情况是:只有一个调用,仅针对dataList.

我想不出什么是错的。我添加了列,因此生成了 ID,但它仍然无法正常工作:(。

4

1 回答 1

5

至于问题的原因,这个构造在同一个作用域内生成了多个同名的JS变量getTaste,基本上是这样的:

<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 回答