我有几个面板,每个面板显示一些内容,并且可以显示零个,一个或多个这些面板,如以下示例所示:

<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部分。

10-04 18:11