You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular中通过DOM设置input值后ngForm提交无法获取对应值如何解决

问题原因

Angular的模板驱动表单(ngForm)依赖输入框的交互事件同步值到表单模型,你通过原生JS直接修改输入框的value属性,没有触发Angular的表单值更新逻辑,所以提交时拿不到哈希值,只有手动修改输入框时才会触发对应的input事件完成值同步。另外你将哈希计算逻辑写在独立JS文件中,脱离Angular组件上下文,也不符合Angular的开发规范。

解决方案(推荐:按Angular规范重构)

第一步:修改Component.ts,整合哈希计算逻辑,定义绑定变量

import { Component} from '@angular/core';
// 如果你用的是crypto-js的sha256,先引入,根据你实际的sha256实现调整
import sha256 from 'crypto-js/sha256';
import encHex from 'crypto-js/enc-hex';

@Component({
  selector: 'app-verify',
  templateUrl: './verify.component.html',
  styleUrls: ['./verify.component.css']
})
export class VerifyComponent{
  // 定义和hash输入框绑定的变量
  fileHash = '';
  txid = '';

  constructor() {}

  calculateHash(file: File, callback: (hash: string) => void) {  
    const reader = new FileReader();
    reader.onload = (event) => {
      // 这里根据你实际的sha256方法调整计算逻辑
      const fileSha256 = encHex.stringify(sha256(reader.result as ArrayBuffer));
      callback(fileSha256);
    };
    reader.readAsArrayBuffer(file);
  }

  calc(event: Event) {
    const input = event.target as HTMLInputElement;
    const file = input.files?.[0];
    if (file) {
      this.calculateHash(file, (fileSha256) => {
        // 直接修改绑定的变量,Angular会自动同步到输入框和表单模型
        this.fileHash = fileSha256;
      });
    }   
  }

  onClickSubmit(data: { txid: string; hash: string; }){
    alert("Entered txid : " + data.txid);
    alert("Entered hash : " + data.hash);
  }
}

第二步:修改Component.html,调整事件和双向绑定

<form #verifyForm="ngForm" (ngSubmit)="onClickSubmit(verifyForm.value)">
   <br> <br> 
   <div class = "form-group">
    <div class="col-sm-9">
        <!-- 把原生onchange换成Angular的(change)事件 -->
        <input class="form-control-file" name="fileInput" id="fileInput" type="file" (change)="calc($event)">     
    </div> <br> 
    <label for = "hash"> Hashwert (sha256)</label><br>
    <!-- 增加ngModel和组件内的fileHash变量双向绑定 -->
    <input type = "text" id = "hash" name = "hash" class= "form-control" [(ngModel)]="fileHash"> <br>
    <label for = "txid"> Transaktions-ID</label><br>
    <input type = "text" id = "txid" name = "txid" class= "form-control" [(ngModel)]="txid"> <br> 
    </div>
    <button class = "btn btn-primary">Verifizieren</button>
</form>

快速修复方案(不重构原有逻辑)

如果不想调整现有代码结构,只需要在你给hash输入框赋值后,手动触发input事件即可让ngForm同步到值,修改calc的回调逻辑:

calculateHash(file, function(file_sha256) {
    const hashInput = document.getElementById("hash");
    hashInput.value = file_sha256;
    // 手动触发input事件,通知Angular表单更新值
    hashInput.dispatchEvent(new Event('input'));
});

内容的提问来源于stack exchange,提问作者user15965549

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 00:45:04