2017-01-29 20 views
1

我有p:datalist其中包含對象集和p:commandButton應該添加一個對象到這個集。但無論我做什麼,datalist更新過快,並且不包含新對象。但是,當我點擊例如2次,datalist刷新2次,第一次刷新後,它不包含任何新元素,但在第二個第一個元素後添加。我如何同步此更新?我試過update="id"/"@all",sync/async,ajax,但它總是一樣的。p:dataList不更新

 <m:form id="lastForm"> 
      <p:commandButton id="addProject" action="#{userBacking.addProject}" value="myadd"> 
      </p:commandButton> 
      <p:dataList id="mydatalist" value="#{userBacking.user.projects.toArray()}" var="project"> 
       #{project.projectName}, #{project.id} 
      </p:dataList> 
     </m:form> 

UserBacking類

@Named 
@RequestScoped 
public class UserBacking { 
    private User user; 

    @Inject 
    private UserService userService; 
    (...) 
    public void addProject() { 
     userService.addProject(user); 
    } 
} 

UserService

@Stateless 
public class UserService extends BaseEntityService<Long, User> { 
    @PersistenceContext 
    private EntityManager entityManager; 
    (...) 
    public void addProject(User user) { 
     User existingUser = get(user); 
     Project proj = new Project(); 
     proj.setProjectName("projectname"); 
     proj.setUser(existingUser); 
     existingUser.addProjects(proj); 
     super.update(existingUser); 
    } 
} 

回答

0

嘗試增加update="mydatalist"屬性您<p:commandButton ... />。在您的支持bean中也使用@ViewScoped而不是@RequestScoped。 RequestScoped bean會在每個請求中創建,因此會丟失先前存儲的數據。只有當根元素更改時,才清除並重新創建ViewScoped bean,即UIViewRoot@ViewScoped輔助bean應該足以管理與ajax一起工作的頁面。

+1

這完全是關於@ViewScoped。 – zachbar

1

我會說你需要actionListener而不是action在你的命令按鈕(除了你的例子中缺少的更新屬性,雖然你說你正在使用它)。 action在服務器的普通POST同步請求期間有其位置。

此外,我的項目中的一般做法是,當在某個頁面中使用ajax處理時,我們使用@ViewScoped豆代替RequestScoped

+0

這完全是關於ViewScoped,但@eni-sinanaj快4分鐘。 – zachbar