我有几个面板,每个面板显示一些内容,并且可以显示零个、一个或多个这些面板,如下面的示例所示:
<div jsf:id="contents">
<ui:fragment rendered="#{aContent.rendered}">
<h:form>
<o:socket channel="a-channel" onmessage"onAMessage"/>
<o:commandScript name="onAMessage"
actionListener=#{aContent.update()}"
render=":aComponent"/>
</h:form>
<my:aComponent id="aComponent" />
</ui:fragment>
<ui:fragment rendered="#{bContent.rendered}">
<h:form>
<o:socket channel="b-channel" onmessage"onBMessage"/>
<o:commandScript name="onBMessage"
actionListener=#{bContent.update()}"
render=":bComponent"/>
</h:form>
<my:bComponent id="bComponent" />
</ui:fragment>
</div>
我想知道发生了什么,客户端web套接字当这些UI片段之一被删除后,从DOM的封闭元素的AJAX更新。
web套接字是否关闭?我应该考虑另一种方法吗?
基于当前实现的方式,它将继续运行。您需要重复connected
属性中的条件。
<ui:fragment rendered="#{aContent.rendered}">
<o:socket ... connected="#{aContent.rendered}" />
当我计划为<o:socket>
添加<f:ajax>
支持时,这可能会得到改进。
另一方面,您的代码片段是非dry的。尝试限制只有1套接字+commandScript组合,它根据推送消息的内容动态地完成工作。另请参阅文档中的通道设计提示部分。