【问题标题】:RichFaces 4 fileupload clear and clear all buttonsRichFaces 4 文件上传清除和清除所有按钮
【发布时间】:2012-04-13 16:37:55
【问题描述】:

目前我有这个:

<rich:fileUpload addLabel="Agregar" clearAllLabel="Quitar todos"
                 clearLabel="Quitar" deleteLabel="Quitar"
                 doneLabel="Completado" uploadLabel="Subir archivos"
                 fileUploadListener="#{uploadBean.doUpload}"
                 acceptedTypes="txt, csv"
                 noDuplicate="true">
    <a4j:ajax event="uploadcomplete" render="validationButton"/>
    <a4j:ajax event="clear" listener="#{uploadBean.doClearFilesList}"
              render="validationButton"/>
</rich:fileUpload>

在支持 bean 上,我有一个上传文件的列表。当我点击Clear/Clear all 按钮时,事件clear 被触发并且doClearFilesList 方法(它只是清除上传的文件列表)是完美的,当用户点击Clear All 按钮时,但是如果用户点击@ 987654326@按钮 应该只是删除列表中与已清除文件对应的项目。

我可以用我的UploadBean.doClearFilesList 方法从列表中删除单个文件吗?应该是这样的:

public void doClearFilesList(){
    files.clear(); //when CLEAR ALL is clicked
    files.remove(oneFile); //when CLEAR is clicked
    validationButtonRendered = false;
}

有什么想法吗?

干杯

更新

RichFaces 4.1.0 最终版 JSF 莫哈拉 2.1.6 雄猫 7

【问题讨论】:

    标签: jsf file-upload richfaces


    【解决方案1】:

    将“onclear”属性添加到您的 组件并调用 并将文件名传递给它,如下所示。

    <rich:fileUpload onclear="clearFunc(event.memo.entry.fileName);" ..../>
    

    您的 应如下所示。

    <a4j:jsFunction name="clearFunc" actionListener="#{uploadBean.clearFile}" ajaxSingle="true">
       <a4j:actionparam name="fName" />
    </a4j:jsFunction>
    

    在侦听器方法中,您可以访问文件名,如下所示。

    public void clearFile(ActionEvent event) {
      FacesContext context = FacesContext.getCurrentInstance();
      String fileName = context.getExternalContext().getRequestParameterMap().get("fName").toString();
      System.out.println("fileName = " + fileName);}
    

    【讨论】:

    • a4j:jsFunction 应该在 fileUpload 标签内吗?比如&lt;rich:fileUpload ... &gt; &lt;a4j:jsFunction ... /&gt; &lt;rich:fileUpload ... /&gt; 我怎么知道点击的按钮是Clear all还是Clear??
    • 我目前使用的是 RichFaces 4.1.0 并且没有 &lt;a4j:actionParam&gt; 所以我使用的是 &lt;a4j:param/&gt; 可以吗?
    • 也尝试了这个线程community.jboss.org/message/727544#727544 的建议,但我无法获得文件名,知道吗?
    • 对不起BRabbit27。似乎 'event.memo.entry.fileName' 没有给出 Richfaces 4.x 中的文件名。
    【解决方案2】:

    我不清楚您在什么时候未能运行https://community.jboss.org/message/727544#727544 中描述的示例

    但是我希望以下内容对您有用,这与上面的示例非常相似。

    页面:

    <h:head>
    <script>
      function clear(event) {
        var files = new Array();
        var data = event.rf.data;
        for (var i in data) {
          files[i] = data[i].name;
        }
        clearFunc(files);
      }
    </script>
    </h:head>
    <body>
      <h:form>
        <rich:fileUpload onclear="clear(event);"/>
        <a4j:jsFunction name="clearFunc" action="#{del.clearFile}" ajaxSingle="true">
          <a4j:param name="fName" assignTo="#{del.fileNames}" />
        </a4j:jsFunction>
      </h:form>
    </body>
    

    类:

    public class Del {
      String[] fileNames;
      public void clearFile() {
        for(String name : fileNames) {
          System.out.println(">>" + name);
          //Do file removing part here
        }
      }
      public String[] getFileNames() {
        return fileNames;
      }
      public void setFileNames(String[] fileNames) {
        this.fileNames = fileNames;
      }
    }
    

    【讨论】:

    • 这很有帮助,谢谢。还有一个问题,我怎么知道clearFile() 函数的调用者是谁?如果是 Clear All 按钮还是 Clear 链接?
    • 我不知道你为什么需要它,很抱歉我没有正确的答案。但是,在您的 Javascript 函数中,您可以通过调用“window.event.srcElement”来访问触发事件的元素。只需 ClearAll 按钮“window.event.srcElement.tagName”返回“SPAN”,删除链接返回“A”。这意味着您可以在 javascript 部分中正确识别组件。因此,在识别组件后,尝试使用 将其传递给服务器。
    猜你喜欢
    • 1970-01-01
    • 2011-08-10
    • 2018-01-20
    • 1970-01-01
    • 2022-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-22
    相关资源
    最近更新 更多