2013-09-03 4 views
2

양식의 일부로 사용되는 사용자 지정 구성 요소에 액세스하는 데 문제가 있습니다.Tapestry 5 양식의 사용자 지정 구성 요소 - 유효성 검사 중 액세스

여기에 이야기가 있습니다. 나는 몇 가지 작동 모드가있는 동적 인 형식이 있습니다. 각 모드는 AJAX로 폼 바디에 선택되고로드 될 수 있습니다. 그 모양 (템플릿) 같습니다 :

AJAX 꽤 잘 작동하고 양식을 따라서 "modeSelect"상태를 변경합니다. 그러나 양식을 제출할 때 문제가 발생합니다. 나는 클래스 정의에 다음과 같이 배치 된 구성 요소에 대한 후크가 있습니다.

//----form elements 
@Component(id = "form") 
private Form form; 

@InjectComponent 
private CompanyMode company; 

@InjectComponent 
private PersonalMode personal; 

@InjectComponent 
private MultiMode multi; 

여기서 * 모드 클래스는 양식 요소와 입력 구성 요소가 포함 된 내 자신의 구성 요소입니다. 유효성 검사를하는 동안 그들에게 액세스 할 수 및 양식을 사용자가 제공 한 값을 확인하려면 계획했지만 nullPointerException있어 그들로부터 아무것도 도달하려고 할 때 - 그 구성 요소가 폼의 클래스 정의에서 초기화되지 않은 것 같습니다. 반면에 양식 구성 요소가 올바르게 주입됩니다 (예를 들어 약간의 오류를 작성할 수 있습니다). 나는 지금 조금 잃어버린다. 양식이 포함 된 클래스 페이지에 구성 요소를 제대로 삽입하는 방법은 무엇입니까? 태피스트리 가이드에서

답변

1

동적 형태가 조금 복잡합니다. Tapestry는 직렬화 된 양식 엔터티를 포함하는 t:formdata 요청 매개 변수를 전달합니다. 그런 다음 POST의 서버 측에서 초기 양식 상태를 다시 수화합니다. 이것은 클라이언트가 보는 것과 항상 최신 상태를 유지해야합니다.

ajax를 통해 동적 콘텐츠를 양식에 추가하려면 FormInjector을 사용해야합니다. 예제를 보려면 AjaxFormLoop의 소스 코드를 확인하십시오.

숨겨진 형태로 조각을 렌더링하고 클라이언트 측 논리에 따라 그들을 볼 수 있도록하려는 경우, 당신이 내가 코드를 가지고 무엇을 할 수있는 또 다른 방법 년대 FormFragment

+0

힌트를 보내 주셔서 감사합니다. 일부 서버 측 조건이 완료된 FormFragment. AJAX에 의해 폼을 다시로드하는 것은 구조가 복잡하지 않은 한 괜찮습니다. 다행히도 양식에 아무 것도 삽입 할 필요가 없습니다. 언급 한 FormFragment를 사용하여 모든 것을 한 번에 넣고 가시성을 제어 할 수 있습니다. 다시 한 번 감사드립니다. 내 하루를 저장했습니다.) – joorva

+0

예, 새로운 양식과 함께 새'''t : formdata''' 값을 얻을 수 있기 때문에 전체 양식을 다시로드하는 것이 좋습니다. HTML 소스를 보시면보실 수 있습니다. –

+0

음, 나는 AJAX에서 부분 만 다시로드하는 데 성공하지만 여전히 구조를 동일하게 유지했습니다. 어쨌든 나는 내가 필요로하는 것을 가지고 있으며, 왜 지금은 효과가 있고, 왜 더 일찍부터하지 않았는지를 다소 이해합니다. 감사. – joorva

0

:

블록이 정상적으로 렌더링하지 않습니다; 블록 안에 을 넣은 구성 요소 나 내용은 일반적으로 렌더링되지 않습니다. 그러나, 블럭을 주입함으로써, 콘텐트가 언제 그리고 언제 콘트롤되는지 정확하게 알 수 있습니다. .

"t : if"또는 "t : delegate"중 하나를 사용하십시오. 이 같은

뭔가 :

<t:zone t:id="modeZone" id="modeZone" t:update="show"> 
     <t:delegate to="myBlock" /> 
</t:zone> 

<t:block t:id="companyBlock"> 
    <t:modes.CompanyMode t:id="company"/> 
</t:block> 
<t:block t:id="personalBlock"> 
    <t:modes.PersonalMode t:id="personal" /> 
</t:block> 

<t:block t:id="multiBlock"> 
    <t:modes.MultiMode t:id="multi" /> 
</t:block> 

자바 : 태피스트리에

@Inject 
private Block companyBlock, personalBlock, multiBlock; 

public Block getMyBlock(){ 
    if (getShowCompany()) return companyBlock; 
    if (getShowPersonal()) return personalBlock; 
    return multiBlock; 
} 
+0

기술적를 사용할 수 있습니다. 문제는 AJAX를 사용하여 양식의 내용을 변경한다는 것이 었습니다. AJAX는 Tapestry에서 허용되지 않는 것처럼 보였습니다 (적어도 전환 블록이 아니라). – joorva

관련 문제