簡體   English   中英

ah:dataTable中的h:inputText在單擊具有立即為true的commandButton后不會保留其狀態

[英]h:inputText inside a h:dataTable does not preserve its state after clicking a commandButton with immediate true

我需要在ah:dataTable中顯示一些必須可編輯的實體。 用戶可以在此表中添加和刪除實體。 問題是,當我添加單擊“添加”按鈕的實體時,用戶鍵入的狀態消失了。

我正在運行Mojarra 2.1.7-jbossorg-1(20120227-1401)

這是第一次顯示該視圖,因為您可以看到dataTable為空: 在此處輸入圖片說明

然后單擊添加,並顯示以下內容: 在此處輸入圖片說明

我在輸入中輸入了一些值: 在此處輸入圖片說明

我再次單擊“添加”,您可以看到我輸入的第一行的值消失了: 在此處輸入圖片說明

我需要保持行的狀態,直到完成版本,也就是單擊“保存”按鈕。

我還嘗試了h:dataTable的rowStatePreserved =“ true”屬性,這是發生的情況:

在第一行中輸入內容后,點擊添加: 在此處輸入圖片說明

第一行狀態被保留,但是添加的第二行與第一行具有相同的值,即使我尚未在其中鍵入任何內容。

代碼

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:p="http://primefaces.org/ui"
    xmlns:oms="http://aom.org/oms"
    xmlns:f="http://java.sun.com/jsf/core">
<h:head>
    <title>Testing</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</h:head>
<h:body>
    <h:form id="myForm" prependId="false">  
        <h:dataTable value="#{testingBean.persons}" var="person" border="1" rowStatePreserved="true">
            <h:column>
                <f:facet name="header">Name</f:facet>
                <h:inputText value="#{person.name}"/>
            </h:column>
            <h:column>
                <f:facet name="header">Age</f:facet>
                <h:inputText value="#{person.age}"/>
            </h:column>
            <h:column>
                <h:commandButton action="#{testingBean.remove(person)}" value="Remove" immediate="true"/>
            </h:column>
        </h:dataTable>
        <h:commandButton action="#{testingBean.add()}" value="Add" immediate="true"/>
        <h:commandButton action="#{testingBean.save()}" value="Save" />
    </h:form>
</h:body>
</html>

TestingBean.java:

package org.aom.oms.controller;

import java.util.ArrayList;
import java.util.List;

import javax.enterprise.inject.Model;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

@ManagedBean
@ViewScoped
public class TestingBean {  


    private List<Person> persons = new ArrayList<TestingBean.Person>();


    public List<Person> getPersons() {
        return persons;
    }

    public void setPersons(List<Person> persons) {
        this.persons = persons;
    }


    //Inner class for testing purpose
    public class Person {
        private String name;
        private Integer age;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public Integer getAge() {
            return age;
        }

        public void setAge(Integer age) {
            this.age = age;
        }
    }

    public void save() {
        System.out.println("Saving...");
        //myRepository.save(persons);
    }

    public void add() {
        persons.add(new Person());
    }

    public void remove(Person person) {
        persons.remove(person);
    }

}  

代替使用h:dataTable,請使用Tomahawk t:datatable

MyFacesDataTable通過兩個重要功能擴展了標准JSF DataTable:

  • 可以保存DataModel的狀態。
  • 支持可點擊的排序標題(請參見SortHeader組件)。

這些屬性使您可以執行所需的操作:

reserveRowStates (布爾值):指示在再次呈現數據表之前是否不應該放棄每一行的狀態。 如果數據表中的輸入組件沒有值綁定,並且應該再次顯示在其中輸入的值,則將其設置為true可能會非常有用。 僅當數據表的數據模型沒有通過排序,刪除或添加行而更改時,這才可靠地工作。 默認值:false

forceIdIndexFormula (String):覆蓋表主體組件構造中的默認行索引的公式。 示例:#{myRowVar.key}>警告,EL應該為每行求值一個唯一的值!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM