1

Primefacesツリーコンポーネントを使用してナビゲーションメニューを開発しました。ツリーノードには、データとしてProjectオブジェクトが含まれています。各プロジェクトをクリックすると動的に読み込まれるプロジェクトの詳細を含むビューを読み込むことができるようにしたいと思います。

そのために、ツリーでajaxイベント選択を定義しました。

<h:form>
    <p:tree value="#{treeBean.root}" var="node"
                    selection="#{treeBean.selectedNode}" id="tree" >
                    <p:ajax event="select" listener="#treeBean.onNodeSelect}"/>
        <p:treeNode styleClass="treeNode">
        <h:outputText value="#{node}" />
        </p:treeNode>
    </p:tree>
</h:form>

これは、treeManagedBeanでonNodeSelectMethodを呼び出します。

@ViewScoped
@Component("treeBean")
@ManagedBean
public class TreeManagedBean{

private Project selectedProject;

public Project getSelectedProject(){
    return selectedProject;
}

public void setSelectedProject(Project project){
    this.selectedProject = project;
}

    public void onNodeSelect(NodeSelectEvent event) {
            this.selectedProject = (Project)event.getTreeNode().getData();
            FacesContext context = FacesContext.getCurrentInstance();
            ConfigurableNavigationHandler handler = (ConfigurableNavigationHandler)             context.getApplication().getNavigationHandler();
            handler.performNavigation("viewProject");
        }

次に、faces-config.xmlを介してviewProject.xhtmlをロードし、他のmanagedBeanにプロパティを設定します。

@Component("projectView")
@ViewScoped
@ManagedBean
public class ProjectView {
    @ManagedProperty("#{treeBean.selectedProject}")
    private Project project; 
}

ビューはエラーなしで読み込まれますが、プロパティが設定されることはありません。ajax呼び出しが機能し、最初のBeanにプロパティを設定しています。これはそれを行う方法ですか?

4

1 に答える 1

0

私は、managedBeansに識別子を追加するだけでそれを解決しました。そのため、デフォルトのコンストラクターを提供する必要がありました。

@ViewScoped
@Component("treeBean")
@ManagedBean("treeBean")
public class TreeManagedBean{ 
   public TreeManagedBean(){}
}

@Component("projectView")
@ViewScoped
@ManagedBean("projectView")
public class ProjectView {
    @ManagedProperty("#{treeBean.selectedProject}")
    private Project project; 
    public ProjectView(){}
}
于 2012-10-01T09:25:58.637 に答える