我有几个面板,每个面板显示一些内容,并且可以显示零个,一个或多个这些面板,如以下示例所示:
<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>
我想知道在封闭元素的AJAX更新之后从DOM中删除这些UI片段之一时,客户端Web套接字会发生什么情况。
Web插座是否关闭?
我应该考虑另一种方法吗?
最佳答案
根据当前的实现方式,它将继续运行。您需要在connected
属性中重复该条件。
<ui:fragment rendered="#{aContent.rendered}">
<o:socket ... connected="#{aContent.rendered}" />
当我计划为
<f:ajax>
添加<o:socket>
支持时,可能会对此有所改善。另一方面,您的代码段是non-DRY。尝试限制为仅1个socket + commandScript组合,该组合可根据推送消息的内容动态地执行其工作。另请参见文档的Channel design hints部分。