Существуют ли внутренние классы для компонентов Primefaces? - PullRequest
0 голосов
/ 06 ноября 2019

Код Primefaces является длинным, и может быть трудно поддерживать контроль в большом веб-приложении.

Некоторые примеры:

HTML

<p:selectOneMenu id="clientToCopyRoles" value="#{form.clientToCopyRoles}"
        rendered="#{form.copyAllowed}">
    <f:selectItem value="#{null}" itemLabel="#{msg.clientSelect}"/>
    <f:selectItems value="#{form.possibleClientsForCopying}"/>
</p:selectOneMenu>
<p:commandButton id="copyRolesToClient"
        rendered="#{form.copyAllowed}"
        disabled="#{form.canCopyRoles}"
        action="#{form.copyRolesToClient()}"
        value="#{msg.copyToClient}"/>

Требуется Java

private boolean copyAllowed;
private Client clientToCopyRoles;
private List<SelectItem> possibleClientsForCopying;
private boolean canCopyRoles;

public Client getClientToCopyRoles() {
    return clientToCopyRoles;
}

public void setClientToCopyRoles(Client clientToCopyRoles) {
    this.clientToCopyRoles = clientToCopyRoles;
}

public boolean isCopyAllowed() {
    return copyAllowed;
}

public void copyRolesToClient() {
    businessLogic.copyRolesToClient(clientToCopyRoles);
}

public List<SelectItem> getPossibleClientsForCopying() {
    return possibleClientsForCopying;
}

public boolean isCanCopyRoles() {
    return canCopyRoles;
}

Это долго, нет очевидной связи между полями классов и компонентами в HTML, и это вводит в заблуждение программистов для реализации сложной и медленной логики в методах получения, которые, как мы знаем, должны вызыватьсянесколько раз JSF во время обработки, и никогда не должны выдавать никаких исключений. Я хотел бы что-то вроде этого:

HTML

<p:selectOneMenu id="clientToCopyRoles" java="#{form.clientToCopyRoles}"
                 nullItemLabel="#{msg.clientSelect}" />
<p:commandButton id="copyRolesToClient" java="#{form.copyRolesToClient}"
                 value="#{msg.copyToClient}"/>

Требуется Java

private final SelectOneMenu<Client> clientToCopyRoles = new SelectOneMenu<>();
private final CommandButton copyRolesToClient = new CommandButton();

public Form() {
    clientToCopyRoles.setRendered(true);
    clientToCopyRoles.setNullItemSelctable(true);
    clientToCopyRoles.setItems(possibleClientsForCopying, Client::getName);
    clientToCopyRoles.onChange(selectOneMenu ->
            copyRolesToClient.setDisabled(selectOneMenu.getSelectedItem() != null));

    copyRolesToClient.setRendered(true);
    copyRolesToClient.setDisabled(true);
    copyRolesToClient.onClick(commandButton ->
            businessLogic.copyRolesToClient(clientToCopyRoles.getSelectedItem()));
}

public SelectOneMenu<Client> getClientToCopyRoles() {
    return clientToCopyRoles;
}

public CommandButton copyRolesToClient() {
    return copyRolesToClient;
}

Конечно, я мог бы написать такие классыкак SelectOneMenu и CommandButton, но это все равно оставит мне гораздо больше HTML:

<p:selectOneMenu id="clientToCopyRoles" value="#{form.clientToCopyRoles.selectedItem}"
        rendered="#{form.clientToCopyRoles.rendered}">
    <f:selectItem value="#{null}" itemLabel="#{msg.clientSelect}"/>
    <f:selectItems value="#{form.clientToCopyRoles.items}"/>
</p:selectOneMenu>
<p:commandButton id="copyRolesToClient"
        rendered="#{form.copyRolesToClient.rendered}"
        disabled="#{form.copyRolesToClient.disabled}"
        action="#{form.copyRolesToClient.click()}"
        value="#{msg.copyToClient}"/>

И если я забуду явно назначить атрибут, такой как rendered в HTML, я мог бы установитьэто true или false на моем бобе, и ничего не произойдет.

Мне кажется, что это что-то настолько базовое, что оно должно определенно (и я предполагаю, что это) где-то в классах Primefacesи я просто не смог найти или понять это правильно. Я внимательно посмотрел на пакет javax.faces.component, который и ожидал атрибут * компоненты 'Primefaces binding, где я и предполагал его найти. Есть некоторые вещи, связанные с чем-то вроде UISelectMany и UISelectItems, но это не похоже на чистый и простой в использовании API, который будет использоваться для программирования интерфейса, но для выполнения внутренних функций (HTML, AJAX и т. Д.).

Существуют ли такие виды внутренних классов для компонентов Primefaces, либо официальная часть, либо, может быть, существует проект, который занимается именно этим (по крайней мере, частью Java)возможно)? Я хотел бы ввести значение по умолчанию вместо того, чтобы писать свое, если это возможно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...