这个很棘手,我不明白它为什么会这样:
<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,但它仍无法正常工作:(。
答案 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>