Большое спасибо за ваши идеи и особенно BalusC (большое спасибо вам). Моим окончательным решением была небольшая мутация, и я хотел бы поделиться со всеми вами.
Поскольку я использую richfaces 3.3.3, это похоже на использование jsf1.2, следовательно, нет <f:ajax>
В обычной ситуации вы должны щелкнуть ссылку со ссылкой, указывающей на внутреннюю ссылку <a id='internalLink'href='#internalLink'>
. Я использую много предварительно упакованных компонентов, где не каждый кликабельный элемент является ссылкой <a>
. Это может быть любой элемент HTML. Было очень полезно использовать плагин Bookmarkable jQuery Бена Алмана (http://benalman.com/projects/jquery-bbq-plugin/)
Обратите внимание: ниже, я могу программно установить значение фрагмента как ключ / значение, и в следующем коде я заменяю старое значение новым значением jQuery.bbq.pushState(state,2)
(или я мог бы просто добавить за старое значение jQuery.bbq.pushState(state)
).
В моем случае ws->md->nd
- это иерархические данные, для которых достаточно иметь один из них, и его родители рассчитываются на сервере, поэтому я заменяю родительское значение дочерним значением.
<ui:repeat value="#{workspaceController.modulesForWorkspace}" var="item">
<a4j:commandLink onclick="var state = {}; state['md'] = '#{item.uuid}';
jQuery.bbq.pushState( state, 2 );"
action="#{workspaceController.setSelectedModule}"
reRender="localesList"
oncomplete="selectNavigationElement(this.parentNode>
<f:param name="selectedModule" value="#{item.uuid}"/>
</a4j:commandLink>
</ui:repeat>
В richfaces это классный способ вызова методов установки из браузера с параметром. Обратите внимание, что sendURLFragment
рассматривается как метод JS с 5 параметрами, а значения передаются на сервер (что очень здорово).
<h:form id="processFragment" prependId="false" style="display: none">
<h:inputText id="fragment" value="#{workspaceController.selectedWorkspace}">
<a4j:support event="onchange"/>
</h:inputText>
<a4j:jsFunction name="sendURLFragment" reRender="workspaces">
<a4j:actionparam name="ws" assignTo="#{workspaceController.selectedWorkspace}"/>
<a4j:actionparam name="md" assignTo="#{workspaceController.selectedModule}"/>
<a4j:actionparam name="nd" assignTo="#{workspaceController.selectedContentNode}"/>
<a4j:actionparam name="ld" assignTo="#{workspaceController.selectedLOD}"/>
<a4j:actionparam name="ln" assignTo="#{workspaceController.contentNodeTreeLocale}"
converter="localeConverter"/>
</a4j:jsFunction>
</h:form>
Делайте это, когда копируете и вставляете новый URL и загружаете страницу.
window.onload = function(){
if(window.location.hash != ""){
//Parse the fragment (hash) from a URL, deserializing it into an object
var deparamObj = jQuery.deparam.fragment();
var ws= '', md= '', nd= '', ld= '', ln = '';
jQuery.each(deparamObj, function(key, value) {
switch(key){
case 'ws':
ws = value;
break;
case 'md':
md = value;
break;
case 'nd':
nd = value;
break;
case 'ld':
ld = value;
break;
case 'ln':
ln = value;
break;
default:
break;
}
});
sendURLFragment(ws,md,nd,ld,ln);
} };