执行ajax事件后,Primefaces动态图形图像为空

时间:2018-11-22 14:25:51

标签: javascript java jsf primefaces

我正在努力地尝试从数据库动态加载的 primefaces graphicimage 的某些奇怪行为(在我看来)。

我的情况:

我有一个 viewscoped 控制器,该控制器为我提供了元素列表( MyHeadObject )。这些HeadObject被称为用户可以选择的项目。更改项目时,将重新加载MyHeadObjects列表。每个元素可以具有一个子元素列表( Details )。我将元素显示在p:datatable中,子元素显示在Sub-p:datatable中,该子嵌套在父数据表中,可以使用p:rowexpansion进行扩展。

行为:

第一次显示页面时,我的图像已正确加载。当我打开行扩展时,图像也正确显示。

但是::如果我关闭并重新打开 rowexpansion ,则图像为空。 通过在p:cellEditor(构面输入)中使用p:fileupload,也可以在数据表rowedit事件上编辑图像。当用户进入行编辑模式时,文件上传将正确显示。在关闭rowedit模式(接受或​​拒绝更改)时,图像也为空。接受更改(或上传新图像)后,数据将正确写入我的数据库。

重新加载页面也无法正确显示图像。图片正确显示的唯一一点是当我通过更改MyHeadObjecs(请参见下文)所在的项目来强制重新加载对象时。

在更改值后,我的对象的其他数据(例如名称/说明)也可以正常显示。如此看来,使用的浏览器(firefox)将图片数据保留在内存中,但无法在ajax事件中刷新它...

我的相关代码段:

我页面的xhtml代码段

<p:dataTable>

[... values of MyHeadObject...]

<p:rowExpansion id="detailExpand">

[... displaying Detail Objects which are nested in MyHeadObject...]

<p:dataTable id="detTable" var="detail" value="#{bauteil.details}"
                        editable="true" tableStyle="vertical-align: top;"
                        editMode="row">                         

    <p:ajax event="rowEdit" listener="#{Partcontroller.onDetailEditComplete}"
                            update=":detailsForm" />

    <p:ajax event="rowEditInit"
                            listener="#{Partcontroller.onDetailEditInit}" />

    <p:column style="width:32px; vertical-align: top;">
            <p:rowEditor />
            <p:rowExpansion />
    </p:column>

此图像标记在rowExpansion的第一次打开时呈现。 在第二行rowExpansion或rowEdit之后不再提供该功能。

    <p:column id="detailPic" headerText="Bild"
                            style="vertical-align: top;">
        <p:cellEditor>

        <f:facet name="output">                                     
          <p:graphicImage value="#{detail.picFullsize}" cache="false" />
        </f:facet>

        <f:facet name="input">
            <h:form enctype="multipart/form-data">
              <p:fileUpload fileUploadListener="#Partcontroller.uploadDetailPicture}" mode="advanced"/>
            </h:form>
        </f:facet>

        </p:cellEditor>
    </p:column>
     [... further columns ...]
   </p:dataTable>
  </p:rowExpansion>
 </p:dataTable>

有关我的Bean的其他信息:

@ManagedBean(name = "Partcontroller")
@ViewScoped
public class PartController implements Serializable {
private List<MyHeadObject> projectParts;

public PartController(){
}

@PostConstruct
public void init(){
  //LOADS NECCESSARY DATA CORRECTLY
}

public List<MyHeadObject> getProjectParts() {
    return projectParts;
}


}

对象“ MyHeadObject”包含一个子元素列表(“详细信息”。这些子元素提供图片,显示为StreamedContent。

public class MyHeadObject implements java.io.Serializable {

public MyHeadObject(){     

}

//diffrent getters, setters and also the Detail setter

public Set<Detail> getDetails() {
    return this.details;
}

public void setDetails(Set<Detail> details) {
    this.details = details;
}

详细信息如下:

public class Detail implements java.io.Serializable {


public Detail() {       
    this.PicFullsize = new DefaultStreamedContent();
}

public StreamedContent getPicFullsize() {
    System.out.println("PicFullSize was requested");
    System.out.println(PicFullsize);
    if(PicFullsize == null || PicFullsize.getStream() == null) {
        if(getDetailBild() != null) {
            System.out.println((getDetailBild().length/1000) + " kB");
        }
        System.out.println("returning null");
        return null;
    }else {
        System.out.println("returning Pic");
            return PicFullsize;         
    }
}

我可以提供的最后信息:所有数据都是通过休眠加载的。在此页面(和其他页面)中正确加载和显示数据。

在此先感谢您的帮助!

0 个答案:

没有答案