将FormData传递给新函数

时间:2016-08-22 13:46:41

标签: javascript jquery ajax

我不确定这个问题是否值得问,但我似乎无法找到解决方法,所以我在这里。

我有一个Flask应用程序,我在其中提交一个表单,将图像上传到服务器。我使用以这种方式创建的FormData发送图像:

$( "#myform" ).submit(function(event) {
    event.preventDefault();
    var $form = $(this),
    formObject = $('form')[0],
    formData = new FormData(formObject);
    // other stuff

然后通过AJAX POST请求将FormData发送到服务器。当POST请求在提交函数内时,此操作可以正常工作。

问题是在另一个视图中,我需要使用相同的代码,但我将AJAX POST请求移出提交函数。因此,当我将formObjectformData传递给包含AJAX请求的函数时,让我们将其称为fctA,它们是未定义的。

我认为我看到了问题,因为提交功能具有特定状态" (因为您可以使用$(this)来获取表单)但我无法找到将formData传递给其他函数的方法。我不想摆脱fctA,因为它可以避免重复大量代码(因为客户端验证)

有没有办法通过不同的函数调用传递FormData?

提前致谢。

//Edit: Here's the code where I want to pass the FormData
//(I'm having trouble indenting it here)
    $.ajax({
        url: "url",
        type: "GET",
        dataType: "json",
        success: function(data) {
        //Create a JSON object to send other form inputs

        /*
        fctA is used to avoid duplicating AJAX POST requests since I
        need to send the data only when meeting some expectations and
        I must display error messages otherwise.
        */
        fctA(json, formObject)
        /*
        The image is correctly sent if I have a POST request that
        uses formData right here instead of passing it to fctA.
        As soon as the POST request leaves the submit function to go to fctA though,
        formData is undefined when I execute the code.
        I tried passing formObject or formData, they are both undefined.
        */
    },
    error: function() {
        //Display an error message
    }
});

2 个答案:

答案 0 :(得分:0)

我不确定为什么它不起作用,但可能是由variable scopes引起的。 formObjectformData是全局变量,因为您没有使用var声明它们。在成功的ajax请求的情况下,ajax-success-handler会调用fctAformObject传递给fctAformObject来自哪里?人们可能期望它在全球范围内可用。出于某种原因,这似乎并非如此。

我建议使用var在本地声明变量,我猜大多数人会同意。全局变量允许任意代码片段之间的影响,这些代码片段难以忽略,难以管理且实际上难以维护。全局变量也会增加意外地给出两个变量同名的变量的风险。

如果在本地声明变量,那么可以在formObject作为参数的函数中包含对$ .ajax的调用,并在submit-handler中调用此函数。 formObject也将在ajax-success-handler中提供,因为Javascript支持闭包。因此,如果您使用可变范围建议的方式,您很可能不会再遇到问题。

答案 1 :(得分:0)

好吧我找到了解决方案,问题是我将formData传递给一个函数,该函数将关键字参数作为最后一个参数,因此formData是关键字参数的值(因为在该调用中使用了默认值)和当然,我期望我的formData的论点是未定义的。

我应该删除整个问题,因为它几乎不会是一个错字问题吗?如果您删除太多问题,可能会阻止告诉您帐户的警告。