2016-09-28 9 views
3

У меня есть несколько панелей, каждая из которых отображает некоторое содержимое, и нуль, одна или несколько из этих панелей могут отображаться, как показано в следующем примере :Что такое поведение JSF WebSocket на стороне клиента при удалении из DOM

<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> 

Я хотел бы знать, что происходит с клиентского веб-сокет на стороне, когда один из этих фрагментов UI удаляется из DOM после обновления AJAX элемента ограждающей.

Закрыт ли сетевой разъем? Должен ли я рассмотреть другой подход?

ответ

3

Основываясь на том, как он выполняется в настоящее время, он будет работать. Вам необходимо повторить условие в атрибуте connected.

<ui:fragment rendered="#{aContent.rendered}"> 
    <o:socket ... connected="#{aContent.rendered}" /> 

Возможно, это будет совершенствоваться позже, когда я планирую добавить поддержку <f:ajax> для <o:socket>.

С другой стороны, ваш фрагмент кода не является DRY. Попробуйте ограничить только 1 комбинацию socket + commandScript, которая выполняет свою работу динамически на основе содержимого нажатого сообщения. См. Также раздел документации Channel design hints.

+0

Спасибо BalusC. Ваш план добавить поддержка выглядит великолепно. Есть ли вероятность, что эта реализация может включать в себя сантехнику для базового уведомления типа , чтобы использовать конструкции типа , где a, b, c будут основными уведомления (только строки)? См. Также: http://stackoverflow.com/questions/39533247/dispatching-web-socket-messages-to-refresh-exactly-what-i-want-in-a-generic-way –

+0

Да, это намерение. – BalusC

+0

Это отличная новость :) Последнее, но не менее важное: я согласен с вами в том, что наличие только одного канала веб-сокета в представлении является хорошей практикой. Но тогда было бы здорово иметь возможность добавлять наблюдателя событий в составной компонент, подобно шаблону CDI @observes, и после приема события составной компонент обновлял только то, что нужно, а не весь компонент. Экспериментальные тесты, выполненные с использованием чистого JavaScript-подхода, показывают, что во время обновления можно сократить сетевой трафик на 50% до 70%, потому что от 50% до 70% составного компонента является статическим HTML –

 Смежные вопросы

  • Нет связанных вопросов^_^