Как узнать идентификатор для рендеринга ajax с использованием двух составных?

У меня есть два композита, и мне нужно визуализировать поле во втором композите, когда я меняю название автомобиля, но показывает эту ошибку:

<f:ajax> contains an unknown id 'nameCli' - cannot locate it in the context of the component nameCar.

Следуйте коду: 1ª композитный автомобиль.xhtml

<composite:interface>
    <composite:attribute name="id" required="true" type="java.lang.String" />
    <composite:attribute name="nameCar" />
    <composite:attribute name="clear" method-signature="java.lang.String action()" />
</composite:interface>

<composite:implementation>
    <label>Car:</label>
    <h:inputText id="nameCar" value="#{cc.attrs.nameCar}">
        <!-- Here is the ajax that call the method 'clear' when the inputText changed -->
        <f:ajax listener="#{cc.attrs.clear}" event="change" render="nameCli ageCli" />
    </h:inputText>
</composite:implementation>

2ª составной клиент.xhtml

<composite:interface>
    <composite:attribute name="id" required="true" type="java.lang.String" />
    <composite:attribute name="nameCli" />
    <composite:attribute name="ageCli" />
</composite:interface>  

<composite:implementation>
    <label>Client's Name:</label>
    <h:inputText id="nameCli" value="#{cc.attrs.nameCli}" />
    <label>Age:</label>
    <h:inputText id="ageCli" value="#{cc.attrs.ageCli}" />
</composite:implementation>

Principal.xhtml

<proj:car id="car" nameCar="#{beanController.car.name}" clear="#{beanController.clear}" />
<proj:client id="client" nameCli="#{beanController.client.name}" ageCli="#{beanController.client.age}" />

И BeanController.java

private Car car;
private Client client;

public String clear() {
    client.setName(null);
    client.setAge(null);
    return null;
}

//getters and setters

Если я изменю

<f:ajax listener="#{cc.attrs.clear}" event="change" render="nameCli ageCli" />

в

<f:ajax listener="#{cc.attrs.clear}" event="change" render=":client:nameCli :client:ageCli" />

тоже не работает

Я не могу позвонить для рендеринга @all или @form, потому что есть другие поля, которые я хочу рендерить.

Отредактировано: разрешение

@BalusC Я оценил ваш комментарий, но ваш ответ на другой вопрос мне не помог. Необходимо было реализовать мой код динамически. Посмотрите на ниже.

В моем файле car.xhtml я снимаю рендеринг ajax

<f:ajax listener="#{cc.attrs.clear}" event="change" />

И в моем BeanController.java я реализовал метод clear следующим образом.

public String clear() {
    client.setName(null);
    client.setAge(null);

    // Get the fields
    UIInput uiNameCli = (UIInput) FacesContext.getCurrentInstance().getViewRoot().findComponent("myForm:client:nameCli");
    UIInput uiAgeCli = (UIInput) FacesContext.getCurrentInstance().getViewRoot().findComponent("myForm:client:ageCli");

    FacesContext context = FacesContext.getCurrentInstance(); // Update the fields.
    context.getPartialViewContext().getRenderIds().add(uiNameCli.getClientId(context));
    context.getPartialViewContext().getRenderIds().add(uiAgeCli.getClientId(context));

    return null;
}

0 ответов

Другие вопросы по тегам