2012-11-25 2 views
3

이 질문은 이전 Language switcher implementation in JSF 2의 후속 조치입니다.JSF 언어 전환기 및 아약스 업데이트

PrimeFaces에서 일부 새로운 빌드가 출시되었지만 JSF 지식이 이전보다 약간 개선되었지만 문제의 내용은 여전히 ​​유효합니다.

요약하면, 나는 완전히 ajaxified 한 xhtml 페이지가 있습니다.

언어 스위처는 이것이다 :

<h:form id="selectLanguage" > 
    <p:commandLink action="#{languageSwitcher.setLanguage('it')}" rendered="#{languageSwitcher.language!='it'}" > 
     <h:graphicImage library ="images" name="it.gif" title="it" /> 
    </p:commandLink> 
    <p:commandLink action="#{languageSwitcher.setLanguage('en')}" rendered="#{languageSwitcher.language!='en'}" > 
     <h:graphicImage library ="images" name="en.gif" title="en" /> 
    </p:commandLink> 
</h:form> 

내가 it 선택할 때 만 en 플래그가 표시되는 것을 원하고 viceversa에. 웹 페이지의 모든 내용이 자원 번들 번역으로 업데이트되기를 바랍니다.

특히, 나는 헤더 속성을 업데이트해야하는 일부 p:dialog S가 있습니다. 대화 형태는 각 대화 안에있는 : 페이지의

<p:dialog header="#{msgs.myHeader}" ... > 
    <h:form .... /> 
</p:dialog > 

나머지는 일부 layoutUnits를 포함하는 <p:layout>이다. 각 layoutUnit에는 번역해야하는 다른 구성 요소가있는 양식이 들어 있습니다.

LanguageSwitcher는 SessionScopedJSF Managed Bean입니다.

나는 다음과 같은 방법을 모두 시도하십시오 p:commandLink 중괄호 불행하게도

내부

p:commandLink 괄호 안에
  1. <f:ajax render="@all" />
  2. update="@all" 속성
  3. <p:ajax update="@all" />p:commandLink 내부를, 그들 중 아무도 없습니다 공장.

    나는 양식의 ID를 삽입 할 수 있지만 @all으로 시도했지만 너무 많지 않습니다. 문제는 대화 상자 헤더가 이런 식으로 업데이트되지 않는다는 것입니다.

    내가 PrimeFaces 3.4.1 사용하고 - (3.4.2) 지금까지 인 Mojarra 2.1.13 모든 PrimeFaces 버전의

+1

전체 질문을 읽지는 않았지만 간단한 ' Daniel

+1

어떤 브라우저를 사용하셨습니까? PrimeFaces의'@ all'은 IE에서 검색된 JavaScript를 후 처리하는 것으로 실패합니다 (수정은 3.4.2로 예정되어 있습니다). ''는'

'에서 전혀 작동하지 않으며 대신''를 사용하십시오. – BalusC

+0

귀중한 의견에 감사드립니다. @ 대니얼 : 실제로 아약스가 필요합니다. – perissf

답변

1

update="@all"는 IE에서 실패하는 것으로 알려져있다. ajax 응답과 함께 전달 된 모든 JavaScript 코드가 제대로 초기화되지 않았습니다.

이 내용은 this PrimeFaces forum topic에서 논의되었으며 issue 4731으로보고되었습니다.

var originalPrimeFacesAjaxResponseFunction = PrimeFaces.ajax.AjaxResponse; 
PrimeFaces.ajax.AjaxResponse = function(responseXML) { 
    var newViewRoot = $(responseXML.documentElement).find("update[id='javax.faces.ViewRoot']").text(); 

    if (newViewRoot) { 
     $('head').html(newViewRoot.substring(newViewRoot.indexOf("<head>") + 6, newViewRoot.indexOf("</head>"))); 
     $('body').html(newViewRoot.substring(newViewRoot.indexOf("<body>") + 6, newViewRoot.indexOf("</body>"))); 
    } else { 
     originalPrimeFacesAjaxResponseFunction.apply(this, arguments); 
    } 
}; 

는 JS 파일의 맛이 제공 : 그들은 그것을 고칠 때까지

, 가장 좋은 건 (아마도)를 update="@all" 명령을 포함하는 모든보기에 자바 스크립트의 다음 조각을로드하여 그것을 해결하는 것입니다 올바른로드 순서를 적용하기 위해 안에 <h:outputScript target="head">에 의해로드됩니다.

<h:body> 
    <h:outputScript name="script.js" target="head" /> 
    ... 
</h:body>