在使用 actionListener 完全填充的记录的对话框编辑后,JSF 使用 AJAX 更新数据表

问题描述 投票:0回答:1

我有一个 PrimeFaces 数据表,每行都有编辑按钮,可打开 Primefaces 动态对话框,但为了克服对话框呈现时的 LazyLoad 异常,我使用

actionListener
重新查询数据库并完全填充
selectedItem

更新对话框中的记录后,数据表不会刷新。我知道我的

update=
是正确的,并且意识到问题是因为我正在更新的对象不是表中引用的实际对象,而是在actionListener中实例化的新的完全加载的对象。

我的解决方法是使用

indexOf
并在完全加载的列表中重新设置该值
selectedItem
这是正确的方法还是这是一种黑客行为?如果对象的 equals 编码不正确,可能会适得其反。

public void update() {     
   dataService.update(selectedItem);
   listOfItems.set(listOfItems.indexOf(selectedItem), selectedItem); <-Typically done?
}


这是我的方法的更多细节
<h:form id="formId">
<p:dataTable id="dataTableId" value="#{dataManagerView.listOfItems}" var="item">

<p:column headerText="Action">
   <p:commandButton oncomplete="PF('editDialogWv').show()" update=":outlookDialogId" 
          actionListener="#{dataManagerView.loadDataViewDetails(item)}" >
       <ui:remove>Cannot do just this due to LazyLoad Exception
          <f:setPropertyActionListener value="#{item}" target="#{dataManagerView.selectedItem}" />
       </ui:remove>
   </p:commandButton>
</p:column>
</p:dataTable>
</h:form>
public void loadDataViewDetails(Item item) {
    // Called from actionListener
    selectedItem = dataService.retrieveFullById(item.getId());
}
<p:dialog id="outlookDialogId" dynamic="true" widgetVar="outlookDialogWv" >
   <h:form id="outlookFormId">
         bunch of form input boxes
     <p:commandButton update="formId:dataTableId" action="#{dataManagerView.update()}">
   </p:commandButton>
   </h:form>
</p:dialog>
public void update() {
   dataService.update(selectedItem); //The selected item only refreshes in table if I manually refresh browser 
}

这可行,但这是正确的方法吗?

public void update() {
   dataService.update(selectedItem);
   listOfItems.set(listOfItems.indexOf(selectedItem), selectedItem);
}
ajax jsf
1个回答
0
投票

这可行,但这是正确的方法吗?

没关系。假设

equals()
方法仅检查技术相等性(例如生成的密钥)而不是自然相等性(整个对象,即所有属性)。否则,您对所选项目所做的更改可能会导致
equals()
返回
false
。更安全的是:

public void loadDataViewDetails(Item item) {
    originalSelectedItem = item;
    selectedItem = dataService.retrieveFullById(item.getId());
}
public void update() {     
   dataService.update(selectedItem);
   listOfItems.set(listOfItems.indexOf(originalSelectedItem), selectedItem);
}

但通常您只需从服务重新加载整个列表,以确保所有其他项目也反映最新的更改,以防同时由其他人编辑。例如

public void update() {     
   dataService.update(selectedItem);
   listOfItems = dataService.list();
}

另请参阅:

© www.soinside.com 2019 - 2024. All rights reserved.