2013-03-15 2 views
0

이 내 페이지의 부분적으로 다시 쓰게 지역에 richfaces/Ajax4jsf를를 사용, 여기에 옷을 벗었 예제 :다시 렌더링 된 영역에서 스크립트를 다시 실행하는 방법은 무엇입니까?

<a4j:commandButton value="..." reRender="infoBlock" action="#{...}"/> 
<h:panelGrid id="infoBlock"> 
    <h:outputText value="..."/> 
    <f:verbatim> 
    <script type="text/javascript"> 
     console.log('test') 
    </script> 
    </f:verbatim> 
</h:panelGrid> 

infoBlock가 다시 렌더링 할 때 내 문제는, 스크립트 console.log('test')가 재실행되지 않습니다됩니다.

그런데 스크립트 태그를 제거하고 oncomplete="console.log('test')"을 사용할 수 있다는 것을 알고 있습니다. 그러나 실제 응용 프로그램에서 스크립트는 사용하는 구성 요소에 의해 렌더링되는 것이 더 복잡하므로이 변경은 매우 까다로운 작업 일 수 있습니다.

내 질문은 : 다시 렌더링 된 영역에서 스크립트를 다시 실행하는 방법은 무엇입니까?

답변

1

제공 한 코드 예제는 사용자가 요구 한 것과 정확히 일치합니다. 버튼을 누를 때마다 - test 텍스트가 콘솔에 기록됩니다. RichFaces에서 즉시 사용 가능한 동작입니다. 다시 렌더링 된 영역의 스크립트는 다시 평가됩니다.

+0

다시 시도했으나 콘솔 로그가 없으며 경고가 작동하지 않습니다. 하지만 이전 버전의 Ajax4jsf : 1.0.6을 사용하고 있습니다. 어쩌면 그게 문제 야? 그들은 새로운 릴리스/부자의 얼굴에서 이것을 바꾸 었는가? –

+1

RichFaces 3.3으로 업데이트하면 잘 작동합니다! –

0

스크립트는 정적이어야하며 동적으로 작동하는 데이터이므로이 작업을 시도하지 마십시오. 대신, 영역이 다시 렌더링 될 때 일부 변경된 동적 데이터에서 작동하는 콜백을 실행하십시오. 이미이 메커니즘을 가지고 있습니다 : oncomplete="rerendered('infoBlock')".

그런 다음 동적 데이터를 읽고 그것으로 뭔가를 어딘가에 정적 코드를해야합니다 - 정적 코드 페이지에 스크립트 요소에 포함되어서는 안 : 왜 그대로 작동하지 않습니다에 관해서는

function rerendered(regionName) { 
    //Do something depending on regionName 
} 

, 우리는 약간 "낮은"수준으로 갈 필요가있다.

주어진 스크립트 요소 객체는 내용이 이미 실행되었는지 여부를 알려주는 플래그를 가지고 있습니다. 스크립트 요소가 기본 DOM 트리에 삽입되면 플래그가 false 인 경우에만 실행됩니다.

.innerHTML 등을 사용하면 html 내부의 스크립트 요소가 전혀 실행되지 않습니다.

위의 메커니즘 중 하나가 사용중인 것으로 보입니다.

+0

나는 당신이 말하는 것을 얻지 만 스크립트 태그는 내가 사용하는 구성 요소에 의해 렌더링되고 코드를 oncomplete 이벤트로 옮기는 것은 매우 까다로운 작업 일 수 있습니다. 둘째, 스크립트 태그의 내용은 backing 빈의 속성에 의존하기 때문에 바뀝니다. –

+0

@ TimBüthe 죄송합니다.하지만 코드를 정적 JS 파일로 옮겨야한다고 생각하지 않습니다. 동적으로 생성해야하는 경우 정적 코드와 동적 데이터를 혼합합니다. 이는 내가 말하는 것이 좋지 않습니다. 'oncomplete' 속성에서 여러분이 필요로하는 것은 수정 된 적이없는 하나의 함수 호출뿐입니다. 예 :'console.log ("test")'와 같은 것을 동적으로 생성합니다. ''test "'문자열 만 동적 데이터이고'console.log'는 정적 코드입니다. 그들은 분리 될 수 있고 분리되어야한다. – Esailija

+0

이것은 불가능하거나 적어도 많은 작업을합니다. [Apache MyFaces] (http://myfaces.apache.org/)를 사용하고 사용 된 구성 요소 [inputCalendar] (http://myfaces.apache.org/tomahawk-project/tomahawk12/tagdoc/t_inputCalendar.html)는 HTML을 렌더링합니다. 20 줄의 동적 JavaScript를 포함하는 스크립트 태그와 함께 이를 바꾸려면 전체 구성 요소를 다시 작성해야합니다. 그래서 나는 어떤 종류의 해결 방법을 찾는다 고 생각합니다. –

관련 문제