2

次のような複合コンポーネントにラップされたカスタム 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. ファイルをアップロードするためvalue、SingleUpload はもう null ではありません
  3. ファイルを削除します

しかし、私が次のことをするとき

  1. fileModel.file != null初期値 ( )を持つ singleUpload コンポーネントを含むページをロードする
  2. 初期値を削除します(ボタンをクリックするremoveFileと呼び出されます)

=> コンポーネントから値を削除することはできないようです。どうして??

4

0 に答える 0