Hi, you should not use viewRoot.createUniqueId() for your components, this is the same as not assigning ids. The rest seems ok for me. You still have problems?
Regards, Volker 2007/3/17, Marko Asplund <[EMAIL PROTECTED]>:
Volker Weber wrote: > > My current problems are related to container components. When I remove > > container components odd things happen. Removing component a results > > in the entire component subtree not being rendered. > > ? Maybe i don't understand you correct, if you remove the parent why > did you expect the children are rendered? > > > If I remove > > container b I fail to get any response for the HTTP request, > > > and if I > > remove both I get an error about MyFaces not being able to add a child > > node (see below). > > What did you mean with remove both ? When you removing a the entire > subtree is removed. > Plese post the code for adding an removing. did you already assign > uniqe ids to all created components, the exception says someting about > dublicate ids. Also add ids to all tags to identifiy the problematic > components. I'm assigning IDs explicitly. While going through the code a minute ago I found a flaw that was causing one problem (in one particular case a container component was added as its own child). What I meant by "removing a container component", was that I modified the code to omit a container from the hierarchy and adding its children directly as children of the omitted component's parent. Currently, if I remove the h:panelGrid element from the view, my custom component tree is not rendered at all. I'll probably want to include my component tree in a some container component such as h:panelGrid but I'd just like to know why this happens. I've done some changes to the code posted earlier, here's the code in a somewhat simplified form. Are there any potential problems with the way the component hierarchy is built? <h:form> <h:panelGrid> <my:inputSelectSet value="#{myBean.items}"/> </h:panelGrid> </h:form> public class MyInputSelectSet extends UIInput { public MyInputSelectSet() { super(); setRendererType(null); } public void encodeBegin(FacesContext ctx) throws IOException { if(this.getChildren().isEmpty()) initializeComponent(); } private void initializeComponent() { for(int i = 0; i<5; i++) addSelectInputParameter(this, app); } private void addSelectInputParameter(UIComponent container, Application app) { MyInputSelect sip = (MyInputSelect)app.createComponent(MyInputSelect.COMPONENT_TYPE); sip.setId(getId()); sip.initializeComponent(); HtmlOutputLabel l = (HtmlOutputLabel)app.createComponent(HtmlOutputLabel.COMPONENT_TYPE); l.setId(getId()); HtmlPanelGroup group = (HtmlPanelGroup)app.createComponent(HtmlPanelGroup.COMPONENT_TYPE); group.setId(getId()); group.getChildren().add(l); group.getChildren().add(sip); container.getChildren().add(group); } public String getFamily() { return COMPONENT_FAMILY; } private String getId() { return FacesContext.getCurrentInstance().getViewRoot().createUniqueId(); } } public class MyInputSelect extends UIInput { public MyInputSelect() { super(); setRendererType(null); } public void initializeComponent() { Application app = FacesContext.getCurrentInstance().getApplication(); UIInput input = (UIInput)app.createComponent(UIInput.COMPONENT_TYPE); input.setId(getId()); this.getChildren().add(input); HtmlSelectManyListbox menu = (HtmlSelectManyListbox)app.createComponent(HtmlSelectManyListbox.COMPONENT_TYPE); menu.setId(getId()); List<SelectItem> items = new ArrayList<SelectItem>(); for(int i = 0; i < 5; i++) items.add(new SelectItem(new String(i), new String(i)); UISelectItems selectItems = new UISelectItems(); selectItems.setId(getId()); selectItems.setValue(items); menu.getChildren().add(selectItems); this.getChildren().add(menu); } public void decode(FacesContext ctx) { // read child component values and set components value accordingly } public String getFamily() { return COMPONENT_FAMILY; } private String getId() { return FacesContext.getCurrentInstance().getViewRoot().createUniqueId(); } }