Использование 2 компонентов на одной странице

#java #jsf #jsf-2 #primefaces #xhtml

#java #jsf #jsf-2 #простые интерфейсы #xhtml

Вопрос:

У меня есть первичное дерево на странице. Я сделал его составным компонентом. В основном он устанавливает свойство selectedNodeName для TreeBean. Я планирую использовать этот компонент дерева на разных страницах. Я пытаюсь использовать этот составной компонент на странице, когда составной компонент (представляющий собой первичное дерево) selectednode изменен h: outputText будет обновлен. Проблема здесь в том, что составной компонент управляется одним компонентом, а остальная часть страницы управляется другим компонентом. Свойство Component selectedNodeName находится в TreeBean, и я хочу использовать это свойство в SomeBean, чтобы я мог обновить значение h:outputText из SomeBean. По сути, я хочу получить selectedNodeName из TreeBean и использовать его в SomeBean.

 <div id="somediv" >
    <h:outputText id="thisis" value="#{someBean.selectedNodeName}"/>
</div>


<cc:someComponent updateButton=":mainForm:treeComponent:someTree :mainForm:thisis"
id="treeComponent" updateAjax=":mainForm:thisis" />
 

Я пробовал управляемое свойство, но безуспешно. Свойство selectedNodeName всегда равно null, никогда не присваивается свойству treeBean selectedNodeName .

     @ManagedProperty(value="#{treeBean.selectedNodeName}")
    private String selectedNodeName; 

    public String getSelectedNodeName() {
    return selectedNodeName;
    }

    public void setSelectedNodeName(String selectedNodeName) {
    this.selectedNodeName= selectedNodeName;
    }
 

Поэтому я попробовал другой подход.

 private String selectedNodeName; 

public String getSelectedNodeName() {
    String tmp = (String)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("selectedNodeName"); 
    selectedNodeName = tmp;
    return nodename;
}

public void setSelectedNodeName(String selectedNodeName) {
    this.selectedNodeName= selectedNodeName;
}
 

Этот подход работает, только если TreeBean имеет sessionscoped, а SomeBean имеет viewscoped. Но я хочу, чтобы оба компонента были просмотрены. Что мне делать? Что-то не так с моим подходом к составным компонентам?

Ответ №1:

Попробуйте установить весь компонент в качестве управляемого свойства. Некоторое время назад у меня были те же проблемы. Это решило проблему для меня:

 @ManagedProperty(value="#{treeBean}")
private TreeBean treeBean; 

  public String getTreeBean() {
     return treeBean;
  }

  public void setTreeBean(TreeBean treeBean) {
     this.treeBean= treeBean;
  }
 

Затем вы также можете получить доступ ко всем свойствам TreeBean в SomeBean.
Удачи!

Комментарии:

1. похоже, я не могу использовать свойство компонента в качестве управляемого свойства.