第二个 dropzone 不监听事件

Second dropzone doesn't listen to events

我正在使用 DropzoneJS 上传文件,我偶然发现了一个我不知道答案的问题。

我基本上有两个拖放区:一个用于多个文件,一个用于单个文件。单文件版本是为了用不同的文件替换上传的文件,因此它只允许上传一个文件,而第一个文件允许多个文件。

第一个 dropzone 运行良好,但我注意到第二个 dropzone 没有正确监听 'sending' 事件和 'success' 事件。它会监听 'error' 事件和 'accept' 事件。第一个 dropzone 有相同的事件,但它适用于该 dropzone,有人知道如何解决这个问题吗?

感兴趣的代码在下面。

空降区

Dropzone.options.requestFileUpload = {
       init: function(){
           this.on('error', function (file, response) {
                console.log("error");
            }),
           this.on('sending', function (file, xhr, formData) {
               if (file.accepted)
                    formData.append('id', 'uploadFile');
            }),
           this.on('success', function (file, response) {
                console.log("success!");
            })
        },
        accept: function(file, done){
           console.log('file accepted!');
        },
        acceptedFiles: ".dxf",
        previewsContainer: false,
        parallelUploads: 5,
        createImageThumbnails: false
    }

    Dropzone.options.requestFileEdit = {
      init: function(){
          this.on('error', function (file, response) {
             //fired
          }),
          this.on('sending', function (file, xhr, formData) {
              // not fired
              console.log("SENDING");
              if (file.accepted)
                 formData.append('id', 'uploadFile');
          }),
          this.on('success', function(file, response){
              // not fired
              console.log('SUCCESS'); 
          })
      },
      accept: function(file, done){
        //fired
      },
      maxFiles: 1,
      acceptedFiles: ".dxf",
      previewsContainer: false,
      createImageThumbnails: false
    }
<script src="https://cdnjs.cloudflare.com/ajax/libs/dropzone/5.1.1/min/dropzone.min.js"></script>
    <body>
       <!-- Some markup -->
       <form data-target="target_I_set_using_JS" action="myaction.php" class="dropzone" id="requestFileEdit"/>
       <!-- Some other markup -->
       <form action="myaction.php" class="dropzone" id="requestFileUpload"/>
    </body>

我不知道为什么会出现这个问题,但是当我稍微研究一下您的代码时,我发现从未调用其中一个拖放区的 init 方法。

这是一个 Dropzones 以编程方式初始化的解决方案(docs),在这种情况下,我可以看到两者dropzones 正在很好地处理事件(嗯,在 post 中,我只看到 error 处理程序被触发,但我认为它在现实世界场景中可以正常工作

Dropzone.autoDiscover = false;

var dzRequestFileEdit = new Dropzone("div#requestFileEdit", {
  url: "/file/post",
  init: function() {
    console.log('initializing requestFileEdit ...');
    this.on('error', function(file, response) {
      console.log("error requestFileEdit");
    });
    this.on('sending', function(file, xhr, formData) {
      console.log('sending from requestFileEdit ...');
      if (file.accepted)
        formData.append('id', 'uploadFile');
    });
    this.on('success', function(file, response) {
      console.log("success!");
    });
  },
  accept: function(file, done) {
    console.log('file accepted!');
  },
  acceptedFiles: ".dxf",
  previewsContainer: false,
  parallelUploads: 5,
  createImageThumbnails: false
});

var dzRequestFileUpload = new Dropzone("div#requestFileUpload", {
  url: "/file/post",
  init: function() {
    console.log('initializing requestFileUpload ...');
    this.on('error', function(file, response) {
      console.log("error requestFileUpload");
    });
    this.on('sending', function(file, xhr, formData) {
      console.log('sending from requestFileUpload ...');
      if (file.accepted)
        formData.append('id', 'uploadFile');
    });
    this.on('success', function(file, response) {
      console.log("success!");
    });
  },
  accept: function(file, done) {
    console.log('file accepted!');
  },
  acceptedFiles: ".dxf",
  previewsContainer: false,
  parallelUploads: 5,
  createImageThumbnails: false
});
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/dropzone/5.1.1/min/dropzone.min.css" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/dropzone/5.1.1/min/basic.min.css" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/dropzone/5.1.1/min/dropzone.min.js"></script>

<body>
  <!-- Some markup -->
  <div style="float:left;width:150px">
    <h3 style="margin:0">File Edit</h3>
    <div class="dropzone" id="requestFileEdit"></div>
  </div>

  <!-- Some other markup -->
  <div style="float:left;width:150px;margin-left:10px;">
    <h3 style="margin:0">File Upload</h3>
    <div class="dropzone" id="requestFileUpload"></div>
  </div>

</body>

让我知道这是否适合你,如果有什么不清楚的地方。

调试后我注意到我没有在接受处理程序下添加 done() 函数,这意味着该文件永远不会被接受。

基本上:

accept: function(file, done){
   //stuff
   done();
}

我觉得自己好傻..