javascript - 无法使用构造函数填充 FormData

标签 javascript angular

<分区>

在我的 Angular 应用程序中,我有以下简单形式:

<form [formGroup]="loginForm" (submit)="login()">
  <div id="container-credentials">
    <input type="text" name="username" formControlName="username">
    <input type="password" name="password" formControlName="password">
  </div>
</form>

当我使用名为 loginFormFormGroup 访问值时,它按预期工作:

login() {
    console.log(this.loginForm.value); // {username: "asd", password: "xyz"}
}

但我想使用 FormData 构造函数从值创建一个 FormData 对象。

FormData 构造函数可以接受一个 HTMLFormElement 参数,如其 docs 中所述。 :

An HTML element — when specified, the FormData object will be populated with the form's current keys/values using the name property of each element for the keys and their submitted value for the values. It will also encode file input content.

所以我尝试将 id 添加到我的表单中:

<form id="myForm" [formGroup]="loginForm" (submit)="login()">

然后在 login() 中:

const myFormElement = document.getElementById('myForm');
const data = new FormData(myFormElement as HTMLFormElement);
console.log(JSON.stringify(data)); // {}

但在这种情况下 FormData 是空的。

我也试过直接从模板传递表单:

<form [formGroup]="loginForm" (submit)="login($event.target)">

然后:

login(target) {
    console.log('Target: ' + target); // Target: [object HTMLFormElement]
    const data = new FormData(target);
    console.log(JSON.stringify(data)); // {}
}

仍然是空的。

我也试过使用 @ViewChildElementRef,结果是一样的。

我知道我可以使用 FormData 方法(例如 append()set())一个一个地添加值,但是我'我也想从更复杂的结构中创建 FormData,这将是最简单的方法(如果可行的话)。

我在这里错过了什么?

如果有任何建议,我将不胜感激。

编辑:

在所有情况下,我都尝试以这种方式检查 FormData:

for (const key of Object.keys(formData)) {
  console.log('Key: ' + key);
  console.log('Value: ' + formData[key]);
}

我没有输出,我认为这也表明 FormData 确实是空的。

最佳答案

使用 FormData.entries() 会返回一个 iterator,您可以使用它来遍历表单中的数据。请注意,我已经在 vanilla JS 中演示了我的示例。

引用:https://developer.mozilla.org/en-US/docs/Web/API/FormData/entries

function login(){
   var form = document.getElementById("loginForm");
   var data = new FormData(form);
   var formData = {};
   for(var pair of data.entries()) {
       formData[pair[0]] = pair[1]; //To convert to object
   }
   console.log(formData);
   return false;
}
<form id="loginForm" name="loginForm" onsubmit="return login()">
  <div id="container-credentials">
    <input type="text" name="username" formControlName="username">
    <input type="password" name="password" formControlName="password">
    <input type="submit" value="submit">
  </div>
</form>

关于javascript - 无法使用构造函数填充 FormData,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54265116/

相关文章:

javascript - 创建一个按钮并在 Jquery 中为每个按钮放置不同的 id

javascript - 到达特定行时如何在网站上更改 Logo

javascript - 如何根据 JSON 对象的属性动态填充 Angular JS 中的显示对象。

javascript - 我需要加载 JQuery 才能完成这项工作吗?

javascript - 为 JSON 属性抛出 Nan 消息

Angular 发出两次 http 请求

Angular 12 警告严重依赖 : the request of a dependency is an expression

javascript - 如何使用单选按钮过滤 jQuery 中的元素

html - 如何在 typescript 中打破 ngFor 循环

javascript - 如何将 LoDash GroupBY 与不同的数组类型一起使用