0

レコードのリストを表示するテーブルと、新しいレコードを追加するダイアログの 2 つの部分がある jsf ページがあります。いくつかの検証機能を追加しましたが、正しく機能させることができません。私はそれが必要です:

1) 最初にダイアログが表示されたときに検証エラーが表示されない

2) 検証エラーが発生した場合は、開いたままにしてエラー メッセージを表示します。

3) 検証エラーがなく、バックエンドが正常に実行された場合は、テーブルを更新します。

これは私が持っているものです:

<h:body>
<h:form id="form01">
    <p:dataTable id="tbl1" value="#{welcomeController.teams}" var="team" >
        <p:column headerText="Id">
            <h:outputText value="#{team.seq}" />
        </p:column>
        <p:column headerText="Name">
            <h:outputText value="#{team.name}" />
        </p:column>
    </p:dataTable>

    <p:dialog id="teamDialog" closable="false" visible="#{welcomeController.addMode}"
            widgetVar="teamDialog_w" modal="true" resizable="false" draggable="true" 
            header="New Team Detail">
        <p:messages />
        <p:panelGrid columns="2">
            <h:outputText value="Name" />
            <p:inputText id="name" value="#{welcomeController.newTeam.name}" />
        </p:panelGrid>
        <p:commandButton value="Submit" ajax="true" actionListener="#{welcomeController.addNewTeam}" 
            update=":form01"oncomplete="teamDialog_w.hide(); console.log(args);" />
    </p:dialog>

    <p:commandButton value="ADD" actionListener="#{welcomeController.startAdd}" 
            oncomplete="teamDialog_w.show(); console.log(args);" update="teamDialog" />

</h:form>

豆:

@Named
@ConversationScoped
public class WelcomeController implements Serializable {
    private final Logger logger = LoggerFactory.getLogger(this.getClass());
    private static final long serialVersionUID = 1L;

    private List<TeamDto> teams;

    @Inject SessionManager sessionMan;
    @Inject DatabaseUtil dbCache;
    @Inject TeamService teamService;
    @Inject Conversation conversation;

    private TeamDto newTeam = new TeamDto();

    private boolean addMode = false;

    public List<TeamDto> getTeams() throws IOException {
        if (teams == null || teams.size() == 0) {
            teams = teamService.getAll();
        }
        return teams;
    }

    public void setTeams(List<TeamDto> teams) {
        this.teams = teams;
    }

    public void reload() {
        conversationBegin();
    }

    public void conversationBegin() {
        if (conversation.isTransient()) {
            conversation.begin();
        }
    }

    public void conversationEnd() {
        if(!conversation.isTransient()){
            conversation.end();
        }
    }

    public void startAdd() {
        reload();
        newTeam = new TeamDto();
        addMode = true;
    }

    public TeamDto getNewTeam() {
        return newTeam;
    }

    public void setNewTeam(TeamDto newTeam) {
        this.newTeam = newTeam;
    }

    public void addNewTeam() throws IOException, ValidatorException {
        if (newTeam.getName().isEmpty()) {
            sessionMan.addGlobalMessageFatal("INVALID INFO", null);
            return;
        }
        teamService.addTeam(newTeam);
        teams.add(newTeam);
        newTeam = new TeamDto();
        addMode = false;
    }

    public boolean isAddMode() {
        return addMode;
    }

    public void setAddMode(boolean addMode) {
        this.addMode = addMode;
    }
}

ここに2つの問題があります:

1) 空の文字列を送信した後、(addMode が true であるため) ダイアログがまだ開くことを期待していますが、そうではありません。それはなぜです?

2)「追加」ボタンを次のように配置した場合:

<p:commandButton value="ADD" actionListener="#{welcomeController.startAdd}" oncomplete="teamDialog_w.show(); console.log(args);" >
    <f:ajax render="teamDialog" />
</p:commandButton>

少なくともダイアログを再度開くと、エラー メッセージが表示されます。しかし、私のコードでは、エラー メッセージが表示されません。なぜそうなのですか?それらは同等ではありませんか?

私の理解に何か問題がありますか?

助けてください。どうもありがとうございました。

4

1 に答える 1

0

ダイアログは、JSF の独自のフォームで動作する必要があります。これは非常に重要です。

検証時にダイアログが閉じないようにするには、 Primefaces で使用できます。

if (args &amp;&amp; !args.validationFailed){PF('eventDialog').hide();}

このような:

<p:commandButton value="ADD"
            actionListener="#{welcomeController.startAdd()}"
            oncomplete="if (args &amp;&amp; !args.validationFailed){PF('teamDialog').hide();}"
            update="your_dialog_formID:messages, other_updated_IDs" />

ここで if (args &amp;&amp; !args.validationFailed){PF('teamDialog').hide();} 、明らかにelse句を追加して、#3「検証エラーがなく、バックエンドが正常に実行された場合は、テーブルを更新してください」を実行できます。

ここで、BalusC はその理由をよく説明しています:

于 2015-07-07T17:38:58.180 に答える