dataList中有多个remoteCommands,但只有一个调用

时间:2013-01-07 17:19:51

标签: forms jsf jsf-2 primefaces datalist

这个很棘手,我不明白它为什么会这样:

<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,但它仍无法正常工作:(。

1 个答案:

答案 0 :(得分:4)

至于问题的原因,这个构造在同一范围内生成多个具有完全相同名称getTaste的JS变量,基本上是这样的:

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

它们基本上按照它们声明的顺序相互覆盖,并且在DOM上调用getTaste()时,基本上实际上会调用最后一个。这与您正在观察的症状完全匹配(通过右键单击生成的HTML源代码,浏览器中的查看源也会告诉您)。

您想为每个人提供一个唯一的JS变量名称。您可以使用varStatus的{​​{1}}属性来获取当前的迭代状态,其中包括<p:dataList>方法。

getIndex()

这样生成的代码最终会得到唯一的JS变量名:

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

顺便说一句,我也会在<script>var getTaste0 = function() { ... }</script> <script>var getTaste1 = function() { ... }</script> <script>var getTaste2 = function() { ... }</script> ... 上应用相同的解决方案。

<p:poll widgetVar>