2017-03-08 499 views
1

我想离开'jQuery universe'并使用更多的vanilla JS。不仅仅是为了增添趣味,我还决定使用Typescript来增加优势;但这里是问题:TypeScript - FormData循环遍历元素(使用getAll()或entries())

在我发送发布请求之前,我需要循环遍历元素。如果没有打字稿我可能会使用的东西,像formDataElement.entries()(或只是为了检查1元formDataElement.getAll('keyForMyFirstEntry')

但PhpStorm和编译器告诉我,有没有像“GETALL”或属性“项”

V2A-16:area51 v2a$ tsc --out public/js/d3-fileupload.vanilla.js module/Application/assets/ts/d3-vanilla-fileupload.ts 
module/Application/assets/ts/d3-vanilla-fileupload.ts(274,12): error TS2339: Property 'getAll' does not exist on type 'FormData'. 

V2A-16:area51 v2a$ tsc --out public/js/d3-fileupload.vanilla.js module/Application/assets/ts/d3-vanilla-fileupload.ts 
module/Application/assets/ts/d3-vanilla-fileupload.ts(274,36): error TS2339: Property 'entries' does not exist on type 'FormData'. 

因此,这里是我的问题:

  • 为什么打字稿仅支持在他的书房(lib.d.ts)追加,还是有一个较新的版本
  • 我怎么能圈通过所有元素来编写,J他们重新给我POST请求

代码:

function FileSelectHandler($event) { 
    let $files = $event.target.files || $event.dataTransfer.files; 
    let $targetName = $event.target.getAttribute('data-related-element'); 
    let $relatedElement = document.querySelectorAll('[name="' + $targetName + '"]'); 
    let $uri = $relatedElement[0].getAttribute('data-upload-uri'); 
    let $xhr = new ajax(); 
    if ($files) { 
     [].forEach.call(
      $files, 
      function ($file) { 
       $data.append('file[]', $file); 
      } 
     ); 
    } 
    $xhr.post(
     $uri, 
     $data 
    ); 
} 

class ajax { 
    [...] 
    public post(
     $url: string, 
     $data: FormData, 
     $callback: (text: any) => any = function() {}, 
     $async: any = true 
    ) { 
     let $query = []; 
     if ($data !== undefined) { 

      /* 
      * Please Help... doesn't work 
      */ 

      for (let $key in $data.entries()) { 
       $query.push(encodeURIComponent($key) + '=' + encodeURIComponent($data[$key])); 
      } 
     } 
     this.send($url, $callback, 'POST', $query.join('&'), $async) 
    } 
} 

回答

0

确定 - 一堆小时,一些新的白发后:

  • 条目()和GETALL()不是每个浏览器支持; Safari和IE都缺失,这就是原因,缺少打字稿支持!
  • 所有你需要做的元素,你必须做之前追加到FormData;在这种情况下encodeURIComponent()(是的,它可能很容易)

但是 - 也许有一个解决方案。我正在考虑为每个对象进行一次预览,并且通过这种补救措施,我需要为每个可用项目保留每个模板。在这种情况下,像顶部代码中的post-circling option会很好。