自定义UIInput复合组件中的resetValue不起作用

时间:2012-05-14 14:43:41

标签: jsf-2 primefaces composite-component

我有一个自定义UIInput包装在一个复合组件中,如下所示:

<cc:interface componentType="SingleUpload">
    <cc:attribute name="value" required="true" />
    ...
</cc:interface>

<cc:implementation>
    ...
    <p:fileUpload id="fileUpload" update="@form" auto="true" 
     fileUploadListener="#{cc.fileUploaded}" rendered="#{cc.attrs.value == null}"/>
    ...
    <h:commandButton rendered="#{cc.attrs.value != null}" action="#{cc.removeFile}">
        <p:ajax execute="@this" update="@form" />
    </h:commandButton>
    ...
</cc:implementation>

支持组件如下所示:

@FacesComponent(value = "SingleUpload")
public class SingleUpload extends UIInput implements NamingContainer, Serializable {

    /** */
    private static final long serialVersionUID = 2656683544308862007L;

    @Override
    public String getFamily() {
        return "javax.faces.NamingContainer";
    }

    public void fileUploaded(FileUploadEvent event) throws IOException {
        FileData file = new FileData();
        file.setContentMimeType(MimeTypeUtils.getContentType(event.getFile().getContentType(), event.getFile().getFileName()));
        file.setInputStream(event.getFile().getInputstream());
        file.setName(FilenameUtils.getName(event.getFile().getFileName()));
        setValue(file);
    }


    public void removeFile() {
        resetValue();
        // value should be null now, but it is not, why??
        FileData value=(FileData) getValue();

    }
}

以这种方式使用:

<ki:singleUpload value="#{fileModel.file}" title="File Upload" />

因此,当调用动作removeFile时,我想将值设置为null。当我按照以下步骤操作时,这是有效的:

  1. 加载包含singleUpload组件但没有初始值(fileModel.file == null
  2. 的页面
  3. 上传文件,因此SingleUpload中的value不再为空
  4. 删除文件
  5. 但是,当我做以下

    1. 加载包含具有初始值(fileModel.file != null
    2. 的singleUpload组件的页面
    3. 删除初始值(点击按钮,调用removeFile
    4. =&GT;从组件中删除值似乎是不可能的。为什么?

0 个答案:

没有答案