2013-03-13 1 views
0

나는 같은 페이지에 같은 여러 가지 형태가 있습니다몇 가지 선택 메뉴, 마지막 하나는 작동

여기
<h:form> 
    <h:selectOneMenu value="#{collectionBean.selectedCollection}"> 
     <f:selectItems value="#{collectionBean.collectionItems}" /> 
     <a4j:support event="onchange" /> 
    </h:selectOneMenu> 
    <a4j:commandButton value="Add" action="#{collectionBean.addToCollection(_resource)}" > 
    </a4j:commandButton> 
</h:form> 

내 콩입니다 : 양식이 연관되어

@Name("collectionBean") 
@Scope(ScopeType.SESSION) 
public class CollectionBean { 
    private String selectedCollection; 

    public String getSelectedCollection() { 
     return selectedCollection; 
    } 

    public void setSelectedCollection(String collectionName) { 
     selectedCollection = collectionName; 
    } 

    public List<SelectItem> getCollectionItems() { 
     ... 
    } 

    public void addToCollection(Resource res) { 
     ... 
    } 
} 

리소스 _resource의 목표는 사용자가 선택한 컬렉션에 리소스를 추가하도록하는 것입니다.

문제는 페이지의 마지막 양식 만 작동한다는 것입니다. 다른 양식의 선택을 변경하면 setSelectedCollection 메서드가 호출되지 않습니다.

무엇이 잘못 될 수 있는지 생각해보십시오.

+1

하나의 동일한 bean 속성에 바인딩되는 여러 개의 구성 요소가 단일 뷰에 있다는 것은 말합니까? 그게 어떻게 이해가 되니? 개별 값을 가져올 수 있도록 별개의 빈 속성에 바인딩하지 않을까요? – BalusC

+0

이것은 리소스 테이블이며, 각 리소스에 대해 사용자가 리소스를 추가 할 컬렉션을 선택할 수 있습니다. 여기에 코드를 표시하지 않았지만 양식에 "추가"버튼도 있습니다. – eskaev

+1

당신의 문제가 여기에 답변 된 동일한 원인을 가지고있는 것처럼 점점 더 보입니다 : http://stackoverflow.com/questions/10972284/hselectonemenu-in-loop/10973440#10973440 당신은 하나의 빈에 여러 구성 요소를 바인딩하고 있습니다. 속성과 어떻게 든이 단일 속성 마법의 여러 값을 한 번에 보유 할 수 있습니다 기대. – BalusC

답변

0

마찬가지로 here과 주석에서 동일한 bean 특성에 여러 구성 요소를 바인드하는 것은 이치에 맞지 않습니다. 그래서 저는 자원 id를 키로하여 backing 빈에서 Map을 사용했습니다.

<h:selectOneMenu value="#{collectionBean.selections[_resource.id]}"> 
    <f:selectItems value="#{collectionBean.collectionItems}" /> 
    <a4j:support event="onchange" /> 
</h:selectOneMenu> 

여전히 주요 문제는 수정되지 않았습니다. 페이지의 마지막 양식 만 수정되었습니다. 다른 모든 형식의 경우 getSelections 메서드는 호출되지 않습니다.

그런 다음 여러 양식 (각 선택 메뉴마다 하나의 양식)을 사용하는 대신 단일 englobing 양식을 사용했습니다. 이유는 모르겠지만 작동했습니다 ...

+0

* 페이지의 마지막 양식 만 작동 * 정상적인 HTML 동작이므로 요청 당 하나의 양식 만 제출할 수 있습니다. * 그런 다음 여러 양식 (각 선택 메뉴에 대해 하나의 양식)을 사용하는 대신 마지막 문장에 기반한 단일 englobing 양식 *을 사용했습니다. 이것이 문제의 가능한 해결책이었습니다. –

+1

그런데,이 경우에는 bean 세션 범위를 지정하지 말고 범위를보아야합니다. CDI에서는 [MyFaces CODI] (http://myfaces.apache.org/extensions/cdi/)를 사용하여이를 수행 할 수 있습니다. –

+0

어쩌면, 같은 페이지에 여러 가지 양식을 작성하고 독립적으로 제출할 수있는 방법은 없습니다. 당신이 맞은 범위에 대해서,하지만이 빈을 세션 범위가 필요한 다른 것들에도 사용합니다. 또한 페이지를 새로 고칠 때 이전 선택을 유지하는 것이 좋지 않습니다. – eskaev

관련 문제