TypeScript - FormData循环遍历元素(使用getAll()或entries())

时间:2017-03-08 11:40:19

标签: javascript typescript xmlhttprequest

我想离开“jQuery”世界'并使用更多的香草JS。不仅仅是为了调情,我还决定使用Typescript来增加优势;但问题出在这里:

在我发送帖子请求之前,我需要循环使用这些元素。如果没有打字稿,我可能会使用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'.

所以这是我的问题:

  • 为什么Typescript只支持在他的库中添加(lib.d.ts),或者是否有更新的版本
  • 如何圈选所有元素以准备我的帖子请求

代码:

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)
    }
}

1 个答案:

答案 0 :(得分:0)

好的 - 经过一段时间和一些新的白发:

    每个浏览器都不支持
  • entry()和getAll();缺少Safari和IE,这也是原因,缺少打字稿支持!
  • 您需要对元素执行的所有操作,您必须先 将其附加到FormData;在这种情况下,encodeURIComponent()(是的,它可能很容易)

但是 - 也许有一个解决方案。我想为每个对象做一点预览,并且通过这个补救措施,我需要为每个可用项目保留每个模板。在这种情况下,顶部代码中的post-circling option就好了。