2011-06-15 3 views
11

제목에 실제로이 모든 내용이 표시됩니다.복합 구성 요소 작업 속성에 인수 전달

Illegal attempt to pass arguments to a composite component lookup expression (i.e. cc.attrs.[identifier]).

내 시도는 다음과 같습니다 :

<composite:interface> 
    <composite:attribute name="removeFieldAction" method-signature="void action(java.lang.String)" /> 
</composite:interface> 
<composite:implementation> 
    <h:commandButton value="Remove" action="#{cc.attrs.removeFieldAction('SomeString')}"/> 
</composite:implementation> 

이 작업을 수행하는 올바른 방법은 무엇입니까 나는 오류로 인해 실패하는 시도를 만들었다?

답변

29

이것은 실제로 작동하지 않습니다. 나중에 "여분"매개 변수를 전달할 수 없습니다. 선언 한대로 method-signature은 복합 구성 요소가 사용 된 측면에서 충족되어야합니다. 예 : 이 원하지 무엇이며, 당신이 정말로의 복합 구성 요소 측면에서 그것을 전달하려는 경우

<my:button action="#{bean.remove('Somestring')}" /> 

복합 구성 요소의 구현은 다음 내가 할 수있는이

<h:commandButton value="Remove" action="#{cc.attrs.removeFieldAction}" /> 

과 같아야합니다 추가 인수를 전달하는 두 가지 방법을 생각해보십시오. 을 작업 수신기와 함께 사용하여 attidional 구성 요소 특성으로 전달하거나 <f:setPropertyActionListner>을 사용하여 JSF가 작업을 호출하기 전에 바로 속성으로 설정하도록 할 수 있습니다. 그러나 둘 다 복합 컴포넌트에 변경 사항이 없습니다. 적어도 전체 bean을 복합 구성 요소의 속성으로 요청해야합니다.

다음은 <f:setPropertyActionListener>의 예입니다. 이 작업을 호출하기 전에 속성을 설정합니다. 이다

<composite:interface> 
    <composite:attribute name="bean" type="java.lang.Object" /> 
    <composite:attribute name="action" type="java.lang.String" /> 
    <composite:attribute name="property" type="java.lang.String" /> 
</composite:interface> 
<composite:implementation> 
    <h:commandButton value="Remove" action="#{cc.attrs.bean[cc.attrs.action]}"> 
     <f:setPropertyActionListener target="#{cc.attrs.bean[cc.attrs.property]}" value="Somestring" /> 
    </h:commandButton> 
</composite:implementation> 

는 위의 예와

<my:button bean="#{bean}" action="removeFieldAction" property="someString" /> 

로 사용되는, 빈은 특정 규칙을 준수하는 경우, 당신은 어쩌면을 생략 할 수 있습니다

public class Bean { 

    private String someString; 

    public void removeFieldAction() { 
     System.out.println(someString); // Somestring 
     // ... 
    } 

    // ... 
} 

과 같아야합니다 property 속성이 모두 있습니다.

+0

Tnx. 복합 요소는 각 필드가 빈의 객체에 링크되어있는 필드 목록을 생성한다는 아이디어입니다. 필드가 UI에서 제거되면 제거 된 필드의 ID를 Bean에 알려야하므로 Bean에서 제거됩니다. 따라서'someString' 매개 변수는 실제로 제거 된 필드의 UUID입니다. 사실, 인수로 이벤트 리스너와 비슷한 것을 얻으려고합니다 ... 해결책 주셔서 감사합니다! – Ben

+1

Hi BalusC. 이 답장을 보내 주셔서 감사합니다. 이것은 Mojarra에서 작동하지만 MyFaces에서는 작동하지 않습니다. 나는 여기에 별개의 문제를 게시했다. 제발 시간 좀 내 주시겠습니까? http://stackoverflow.com/questions/17357593/passed-argument-to-method-inside-composite-component-does-not-work-on-myfaces 대단히 감사합니다. –