2017-01-29 8 views
1

У меня есть p:datalist который содержит Набор объектов и p:commandButton которые должны добавить один объект в этот набор. Но что бы я ни делал, datalist обновляется слишком рано и не содержит нового объекта. Но когда я нажимаю, например, 2 раза, datalist обновляется 2 раза, и после первого обновления он не содержит никакого нового элемента, но после добавления второго первого элемента. Как синхронизировать это обновление? Я пробовал update="id"/"@all", sync/async, ajax, но он всегда один и тот же.p: dataList не обновляется

Page

 <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 ... />. Также используйте @ViewScoped вместо @RequestScoped в своей фасоли. Компонент RequestScoped создается при каждом запросе, поэтому теряет ранее сохраненные данные. Компонент ViewScoped вместо этого очищается и воссоздается только при изменении корневого элемента, то есть UIViewRoot. @ViewScoped Бэкбон должен быть достаточным для управления страницей, которая работает с ajax.

+1

Это все о @ViewScoped. – zachbar

1

Я бы сказал, что вам нужно указать actionListener вместо action в вашей командной кнопке (помимо атрибута обновления, отсутствующего в вашем примере, хотя вы говорите, что используете его). action имеет свое место во время обычных синхронных запросов POST к серверу.

Кроме того, общая практика моих проектов заключается в том, что при обработке ajax на определенной странице мы использовали @ViewScoped бобы вместо RequestScoped единиц.

+0

Это все о ViewScoped, но @ eni-sinanaj было на 4 минуты быстрее. – zachbar