javascript - JSF - 通过 jquery 更新的表未反射(reflect)在服务器端的页面提交上

标签 javascript jquery jsf jsf-2

我通过 ui:repeat 标签在 JSF 中创建了一个表。我正在尝试通过 jquery 在客户端添加/删除行。通过显示新添加的行或删除前端的特定行,效果很好。

但是,当我提交表单以查看新行是否反射(reflect)在服务器端时,数组列表似乎没有反射(reflect)浏览器上显示的最新行,但它只有初始列表在更新之前出现。

我是 JSF 新手,经过大量搜索后,我无法找到如何更新新行以反射(reflect)在最初创建表的服务器端数组列表上。

谁能告诉我这是否可能,如果可以的话如何做到?

提前致谢。

请在下面找到我的代码:

JSF:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets">

<h:outputScript library="js" name="jquery-2.1.0.js" target="body" />
<h:outputScript target="body">
function my_new_js_function()
{
  $('tr').click(function(){
            var currentRow = $(this);
            currentRow.remove();
    });
  
  return false;
}

function appendNewDummyRow()
{
$('#myTable').append('<tr id="myRow"><td id="myCell"><input id="myForm:myObjectId:5:empName" type="text" name="myForm:myObjectId:5:empName" value="New Name" size="10" /></td><td><input id="myForm:myObjectId:5:empDepartment" type="text" name="myForm:myObjectId:5:empDepartment" value="New Customer Care" size="20" /></td><td><input id="myForm:myObjectId:5:empAge" type="text" name="myForm:myObjectId:5:empAge" value="0" size="5" /></td><td><input id="myForm:myObjectId:5:empSalary" type="text" name="myForm:myObjectId:5:empSalary" value="0" size="5" /></td><td><a class="deleteLink" onclick="my_new_js_function();return false;">delete</a></td></tr>');

//alert(document.getElementById('myTable').innerHTML);

$('#myTable').html(document.getElementById('myTable').innerHTML);

return false;
}

</h:outputScript>

<h:head>
    <title>JSF Sample</title>
    <h:outputStylesheet library="css" name="styles.css" />
</h:head>
<h:body>
    <div id="msgid"></div>
    <h2>DataTable Example</h2>
    <h:form id="myForm">
        <table id="myTable" border="1" styleClass="employeeTable">
            <ui:repeat id="myObjectId" var="employee" value="#{userData.employees}">
                <tr id="myRow">
                    <td id="myCell"><h:inputText id="empName" value="#{employee.name}" size="10" /></td>
                    <td><h:inputText id="empDepartment" value="#{employee.department}" size="20" />
                    </td>
                    <td><h:inputText id="empAge" value="#{employee.age}" size="5" /></td>
                    <td><h:inputText id="empSalary" value="#{employee.salary}" size="5" /></td>
                    <td><a class="deleteLink"
                        onclick="my_new_js_function();return false;" href="">delete</a></td>
                </tr>
            </ui:repeat>
        </table>
        <h:commandButton value="Check Result" action="#{userData.checkResult}">
            <f:ajax execute="@form @this"></f:ajax>
        </h:commandButton>
        <a  onclick="appendNewDummyRow();return false;" href="">addDummyRow</a>
    </h:form>
</h:body>
</html>

UserBean.java:

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

@ManagedBean(name = "userData")
@SessionScoped
public class UserData implements Serializable {

    public UserData()
    {
    if(employees == null)
        employees  = new ArrayList<Employee>(); 
    }
private static final long serialVersionUID = 1L;

   private String name;
   private String department;
   private int age;
   private double salary;
   
   private ArrayList<Employee> employees
      = new ArrayList<Employee>(Arrays.asList(
      new Employee("John", "Marketing", 30,2000.00),
      new Employee("Robert", "Marketing", 35,3000.00),
      new Employee("Mark", "Sales", 25,2500.00),
      new Employee("Chris", "Marketing", 33,2500.00),
      new Employee("Peter", "Customer Care", 20,1500.00)
   ));  
   
    public ArrayList<Employee> getEmployees() {
      return employees;
   }

   public void setEmployees(ArrayList<Employee> employees) {
          this.employees = employees;
   }
   
   public String addEmployee() {         
      Employee employee = new Employee(name,department,age,salary);
      employees.add(employee);
      return null;
   }

   public String deleteEmployee(Employee employee) {
      employees.remove(employee);       
      return null;
   }

   public void checkResult() {
       System.out.println("printing new size of the list = "+ employees.size());
       
       for (Employee employee : employees){
             System.out.println("Value given from input text = "+ employee.getName());
          }
       
       }
   
   public String editEmployee(Employee employee){
      employee.setCanEdit(true);
      return null;
   }

   public String saveEmployees(){
      //set "canEdit" of all employees to false 
      for (Employee employee : employees){
         employee.setCanEdit(false);
      }     
      return null;
   }
   
   public String getName() {
      return name;
   }

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

   public String getDepartment() {
      return department;
   }

   public void setDepartment(String department) {
      this.department = department;
   }

   public int getAge() {
      return age;
   }

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

   public double getSalary() {
      return salary;
   }

   public void setSalary(double salary) {
      this.salary = salary;
   }
}

最佳答案

您不能那样操纵 JSF 状态。

您必须从服务器端添加新行,并通过更新 ui:repeat 来呈现它们。

而不是 <a onclick="appendNewDummyRow();return false;" href="">addDummyRow</a>您应该创建一个按钮(或命令链接)作为

<p:commandButton value="addDummyRow" process="@this" update="myObjectId" action="#{userData.addEmployee}" />

关于javascript - JSF - 通过 jquery 更新的表未反射(reflect)在服务器端的页面提交上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23164217/

相关文章:

javascript - 在 socket.emit() 中传递参数的问题

javascript - 如何使用 Bootstrap Multiselect 显示选定的值

PHP 函数为 jQuery.ajax 调用中的成功方法返回 'null'

javascript - 如何缩放 Canvas 绘图

jquery - Ajax 提交 - 选择并聚焦字段并出现验证错误

javascript - 为什么 Angular 允许动态对象创建?

javascript - 通过 JavaScript 创建时内联 block 元素的行为不一致

javascript - 尝试用选项填充下拉菜单。仅存储一个值

java - MyFacesServlet 包装器中的 FacesMessages

JSF 跳过阶段 - 如何调试?