jsf primefaces教學 - 在JSF中按ID查找組件




3 Answers

您可以使用以下代碼:

public UIComponent findComponent(final String id) {

    FacesContext context = FacesContext.getCurrentInstance(); 
    UIViewRoot root = context.getViewRoot();
    final UIComponent[] found = new UIComponent[1];

    root.visitTree(new FullVisitContext(context), new VisitCallback() {     
        @Override
        public VisitResult visit(VisitContext context, UIComponent component) {
            if(component.getId().equals(id)){
                found[0] = component;
                return VisitResult.COMPLETE;
            }
            return VisitResult.ACCEPT;              
        }
    });

    return found[0];

}

此代碼將僅找到樹中具有您傳遞的id的第一個組件。 如果樹中有2個具有相同名稱的組件,則必須執行自定義操作(如果它們位於2個不同的命名容器下,則可以這樣做)。

demo datatable

我想通過我提供的id從託管bean中找到一些UIComponent

我寫了以下代碼:

private UIComponent getUIComponent(String id) {  
      return FacesContext.getCurrentInstance().getViewRoot().findComponent(id) ;  
}

我已經將p:inputTextarea定義為:

<p:inputTextarea id="activityDescription" value="#{adminController.activityDTO.activityDescription}" required="true" maxlength="120"
    autoResize="true" counter="counter" counterTemplate="{0} characters remaining." cols="80" rows="2" />

現在,如果調用方法作為getUIComponent("activityDescription")它返回null ,但如果我將其稱為getUIComponent("adminTabView:activityForm:activityDescription")那麼我可以獲取org.primefaces.component.inputtextarea.InputTextarea實例。

有沒有辦法讓組件只有id,即“activityDescription”不是絕對id,即“adminTabView:activityForm:activityDescription”?




我試試這段代碼,這有幫助:

private static UIComponent getUIComponentOfId(UIComponent root, String id){
    if(root.getId().equals(id)){
        return root;
    }
    if(root.getChildCount() > 0){
        for(UIComponent subUiComponent : root.getChildren()){
                UIComponent returnComponent = getUIComponentOfId(subUiComponent, id);
                if(returnComponent != null){
                    return returnComponent;
            }
        }
    }
    return null;
}

謝謝




是的,在NamingContainers所有父組件中,您必須添加屬性prependId="false" - 它肯定會在<h:form>中工作,並且應該在其他組件中工作。
如果無法通過.xhtml文件中的屬性進行設置,則必須設置此值為programaticaly。

問題的作者評論後的建議:

如果您正在使用的組件中沒有此類屬性,請嘗試使用以下方法編寫find方法:

private UIComponent findComponent(String id, UIComponent where) {
if (where == null) {
   return null;
}
else if (where.getId().equals(id)) {
   return where;
}
else {
   List<UIComponent> childrenList = where.getChildren();
   if (childrenList == null || childrenList.isEmpty()) {
      return null;
   }
   for (UIComponent child : childrenList) {
      UIComponent result = null;
      result = findComponent(id, child);
      if(result != null) {
         return result;
   }
   return null;
}   

接下來只需調用

UIComponent iamLookingFor = findComponent(myId, FacesContext.getCurrentInstance().getViewRoot());

那會有幫助嗎?




Related

jsf jsf-2 primefaces uicomponents