angular表单验证不生效d

zxp1103 2018-11-26 10:29:35
前端用的angular框架,写了个模板文件,里面的表单验证一直不对,会报错:

core.es5.js:1020 ERROR TypeError: Cannot read property 'valid' of undefined

其它功能都是正常的。
HTML文件如下:
<form *ngIf="desc" (ngSubmit)="f.form.valid && onCreate()" #f="ngForm" novalidate>
<div class="help-block error box" *ngIf="errors">
<ul>
<li *ngFor="let error of errors">{{ error }}</li>
</ul>
</div>
<ng-template ngFor let-field [ngForOf]="desc.fields">
<div class="form-group" *ngIf="field.isEditableOnCreate" [ngClass]="{ 'warn': f.submitted && input && !input.valid }" [ngSwitch]="field.dataType">
<label for="{{ field.name }}">{{ field.displayName }}</label>
<div class="select" *ngIf="referenceFields && referenceFields[field.name]; else elseBlock">
<select name="{{ field.name }}" [(ngModel)]="model[field.name]" #input="ngModel">
<option *ngFor="let opt of referenceFields[field.name]" [value]="opt.id">{{ opt.displayName || opt.name || opt.internalReferenceId }}</option>
</select>
</div>
<ng-template #elseBlock>
<input *ngSwitchCase="EntityFieldDataType.boolean" type="checkbox" class="form-control" name="{{ field.name }}" [(ngModel)]="model[field.name]"
#input="ngModel" />
<textarea *ngSwitchCase="EntityFieldDataType.text" type="text" class="form-control" name="{{ field.name }}" [(ngModel)]="model[field.name]"
#input="ngModel"></textarea>
<input *ngSwitchCase="EntityFieldDataType.dateTime" type="date" class="form-control" name="{{ field.name }}" [(ngModel)]="model[field.name]"
#input="ngModel" />
<input *ngSwitchDefault type="text" class="form-control" name="{{ field.name }}" [(ngModel)]="model[field.name]" #input="ngModel"
[required]="field.isRequired" />
</ng-template>
<div *ngIf="f.submitted && !input.valid" class="help-block">请填写{{ field.displayName }}</div>
</div>
</ng-template>
<ng-content></ng-content>
<div class="form-group">
<button type="submit" class="btn btn-primary">{{ createText }}</button>
</div>
</form>


发生这个错误之后,页面就会出现问题重复加载的问题,不能正常的刷新,除非自己强制刷新。
如下图:


求大神赐教
...全文
343 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
zxp1103 2018-11-26
  • 打赏
  • 举报
回复
调用模块实例:
<h1>新建产品</h1>

<a routerLink="/products" class="btn btn-icon"><clr-icon shape="close"></clr-icon></a>

<app-entity-create [desc]="desc" [createText]="'创建产品'" [errors]="errors" [referenceFields]="referenceFields" (create)="create($event)"></app-entity-create>
TS文件:
import { Component, OnInit } from '@angular/core';
import { ProductService } from '../_services/product.service';
import { EntityDescription } from '../entity-description';
import { ProductCategory } from '../product-category';
import { Router } from '@angular/router';
import { Product } from '../product';
import { ProductCategoryService } from '../_services/product-category.service';

@Component({
  selector: 'app-product-create',
  templateUrl: './product-create.component.html',
  providers: [ProductService, ProductCategoryService]
})
export class ProductCreateComponent implements OnInit {

  loading: boolean = false;
  desc: EntityDescription;
  errors: any[];
  referenceFields: { [fieldName: string]: any[] };

  constructor(private productService: ProductService, private productCategoryService: ProductCategoryService, private router: Router) { }

  ngOnInit() {
    this.getDesc().then(desc => this.getProductCategories());
  }

  getDesc(): Promise<EntityDescription> {
    return this.productService.getDesc()
      .then(desc => this.desc = desc);
  }

  getProductCategories() {
    this.productCategoryService.getCategories()
      .then(cats => this.referenceFields = { "categoryId": cats });
  }

  create(model: any) {
    if (this.loading)
      return;

    this.loading = true;

    let product = new Product();

    for (let field of this.desc.fields) {
      if (!field.isEditableOnCreate)
        continue;
      product[field.name] = model[field.name];
    }

    this.productService.createProduct(product)
      .then(product => this.router.navigate(['/products', product.id]))
      .catch(reason => {
        this.errors = [reason];
        this.loading = false;
      });
  }
}
zxp1103 2018-11-26
  • 打赏
  • 举报
回复
引用 1 楼 讨厌走开啦 的回复:
js贴出来,一般重复渲染的问题是由于有原生js(或者jquery)和angular操作同一个dom引起的。
谢谢回复。 用的是TypeScript,因为是MVVM框架,所以自己并没有用代码去操作dom。 并且这个问题也是因为那个表单验证报错之后才会出现哦 TS代码如下:
import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core';
import { EntityDescription } from '../entity-description';
import { EntityFieldDataType } from '../entity-field-data-type.enum';

@Component({
  selector: 'app-entity-create',
  templateUrl: './entity-create.component.html'
})
export class EntityCreateComponent implements OnInit {

  @Input() desc:EntityDescription;
  @Input() createText:string;
  @Input() errors:any[];
  model:any = {};
  @Input() referenceFields:{[fieldName:string]:any[]};
  @Output() create:EventEmitter<any> = new EventEmitter<any>();
  EntityFieldDataType = EntityFieldDataType;

  constructor() { }

  ngOnInit() {
  }

  onCreate() {
    this.create.emit(this.model);
  }

}
讨厌走开啦 2018-11-26
  • 打赏
  • 举报
回复
js贴出来,一般重复渲染的问题是由于有原生js(或者jquery)和angular操作同一个dom引起的。
讨厌走开啦 2018-11-26
  • 打赏
  • 举报
回复
引用 2 楼 zxp1103 的回复:
[quote=引用 1 楼 讨厌走开啦 的回复:] js贴出来,一般重复渲染的问题是由于有原生js(或者jquery)和angular操作同一个dom引起的。
谢谢回复。 用的是TypeScript,因为是MVVM框架,所以自己并没有用代码去操作dom。 并且这个问题也是因为那个表单验证报错之后才会出现哦 TS代码如下:
import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core';
import { EntityDescription } from '../entity-description';
import { EntityFieldDataType } from '../entity-field-data-type.enum';

@Component({
  selector: 'app-entity-create',
  templateUrl: './entity-create.component.html'
})
export class EntityCreateComponent implements OnInit {

  @Input() desc:EntityDescription;
  @Input() createText:string;
  @Input() errors:any[];
  model:any = {};
  @Input() referenceFields:{[fieldName:string]:any[]};
  @Output() create:EventEmitter<any> = new EventEmitter<any>();
  EntityFieldDataType = EntityFieldDataType;

  constructor() { }

  ngOnInit() {
  }

  onCreate() {
    this.create.emit(this.model);
  }

}
[/quote] 这里用TypeScript和我之前说的“有原生js(或者jquery)和angular操作同一个dom”实质是一样的,你用TypeScript操作dom一样会有重复渲染的问题,有2个方案: 1.用TypeScript操作angular作用域下左侧菜单列表对应的angular变量(不直接操作dom); 2.每次变更左侧菜单的时候清空dom。
AngularJS提供了表单验证,但是验证的过程交互体验很不好,比如重设密码,重复密码的时候一键入就会提示密码不正确,现整理了两种方法,仅供借鉴。 一,点击提交验证 <form action= class=form-horizontal col-md-9 name=reset_pwd ng-submit=resetPwd()>
本门课程共有6个章节,通过4个项目,让您掌握Springboot和SpringCloud作为服务端的工作机制,Angular框架作为前端开发框架的使用方法,以及应用于网站制作和作为移动端用户界面;Spring Security+JWT作为安全框架,对网站和移动端,进行用户认证、角色访问控制;掌握Hybird开发技术在Android和iOS移动客户端中的应用;云服务器配置技术,包括java运行环境安装、Nginx作为web服务器和前后端分离的实现、SSL证书的申请与配置等内容; 第一章介绍了前后端开发环境的搭建和开发工具的安装,包括Java JDK的安装、Maven依赖管理工具的安装、NodeJS开发环境的安装、Angular开发环境的安装、Git版本管理工具的使用 第二章通过体脂计算器(BMI)项目,掌握使用Maven生成Springboot工程,Angular与Springboot的协作机制、从而理解前后端分别架构的实现方法。 第三章通过开发一个CMS系统,既网站内容管理系统,来掌握Springboot操作数据库、Angular框架与NG-BootStrap框架作为前端框架,并与Springboot服务端交互的协作机制;其中还包含了程序员的必备技能,既增、删、查、改、数据分页、文件上传、Web在线编辑器的集成与使用等内容。通过本章节的学习,你可以做出一个能自动适应各种屏幕尺寸网站项目。 第四章我们通过开发CMS系统的移动端版本,来掌握ionic框架的使用;首先我们我们将第三章的网站内容无缝衔接的显示在移动端上,并通过一个仿微信朋友圈的模块,来掌握ionic capacitor框架调用手机的摄像头,以及图片的编码转换等内容, 第五章我们通过使用Spring Security+Jwt技术来保护我们的CMS网站版和移动端,来学习Spring boot+JWT的运行机制。然后我们通过将服务端和Web端部署到云服务器上,来学习网络系统的上云步骤,其中包括域名申请、服务器采购、服务器配置,其中包括,Java运行环境的安装、Springboot运行环境部署,Nginx通过代理实现前后端分离,以及SSL证书的申请与配置等内容,服务器操作系统我们使用Cent OS,你还能学到使用XShell和XFTP进行网站管理;除此之外,我们还介绍了,android开发环境的配置以及签名发布、iOS开发环境的配置,并最终实现在真机设备上可以运行CMS移动端项目。 第六章我们通过一个网上花店电商项目作为实训项目,这个项目,服务端部分我们使用Spring Cloud,通过用户认证模块、花店模块、支付中心模块之间的相互协作,让您掌握在Spring Cloud框架中Eureka、Zuul、Feign的使用方法;客户端部分,在这个项目中我们采用运行在云服务器上的ionic作为用户界面,并通过Ionic与Android和iOS原生代码的交互过程,来学习JS Bridge技术,从而掌握Hybird移动端开发技术,这种技术可以有效地解决App上架缓慢、更新不及时的问题。同时平衡使用Web与原生开发的性能问题。花店项目是一个电商项目,自然少不了支付功能,我们在课程中可以学到如何集成微信和支付宝,并使用他们进行登录验证和支付。  为什么我要上这门课 现在的网络应用,一般都在网站、Android、iOS和微信四平台同时发布,为了适应这一趋势,我们必须把自己打造成“全栈工程师”,能独立开发“一网三平台”网络应用才能在目前的市场环境中生存。而这四个平台,以往至少需要四名程序员才能完成,面对浩如烟海的知识,本门课程采取弱水三千尺,只取一瓢饮的办法,从开发工作的实际需要出发,将工作中最常用的20%提炼出来,并在实际应用中,反复演练,让你通过,每门技术这最常用的20%,来应付80%的工作。 谁应该报名上这门课如果你是一名计算机专业的学生,那么本门课程可以作为你的实训课程,让你体验到软件企业开发工作中的实际需要,并在本门课程的学习过程中,快速度过计算机专业学生普遍存在的“断奶期”问题 如果您是一名渴望丰富自身技能的程序员,并且对Springboot、Spring Security+JWT、Spring Cloud、Angular、Ionic、Hybird移动端开发技术,有着浓厚的兴趣,但对于瀚如烟海的知识点,又让您望洋兴叹,那么在本门课程中,将会为您抛砖引玉,让您茅塞顿开。 
amis 是一个低代码前端框架,它使用 JSON 配置来生成页面,可以节省页面开发工作量,极大提升开发前端页面的效率。 目前在百度广泛用于内部平台的前端开发,已有 100+ 部门使用,创建了 3w+ 页面。 特点: 1、不需要懂前端:在百度内部,大部分 amis 用户之前从来没写过前端页面,也不会 JavaScript,却能做出专业且复杂的后台界面,这是所有其他前端 UI 库都无法做到的; 2、不受前端技术更新的影响:百度内部最老的 amis 页面是 4 年多前创建的,至今还在使用,而当年的 Angular/Vue/React 版本现在都废弃了,当年流行的 Gulp 也被 Webpack 取代了,如果这些页面不是用 amis,现在的维护成本会很高; 3、享受 amis 的不断升级:amis 一直在提升细节交互体验,比如表格首行冻结、下拉框大数据下不卡顿等,之前的 JSON 配置完全不需要修改; 4、可以完全使用可视化页面编辑器 来制作页面:一般前端可视化编辑器只能用来做静态原型,而 amis 可视化编辑器做出的页面是可以直接上线的。 5、提供完整的界面解决方案:其它 UI 框架必须使用 JavaScript 来组装业务逻辑,而 amis 只需 JSON 配置就能完成完整功能开发,包括数据获取、表单提交及验证等功能,做出来的页面不需要经过二次开发就能直接上线; 6、内置 100+ 种 UI 组件:包括其它 UI 框架都不会提供的富文本编辑器、条件组合等,能满足各种页面组件展现的需求,而且对于特殊的展现形式还可以通过 自定义组件 来扩充; 7、容器支持无限级嵌套:可以通过组合来满足各种布局需求; 8、经历了长时间的实战考验:amis 在百度内部得到了广泛使用,在 4 年多的时间里创建了 3 万+ 页面,从内容审核到机器管理,从数据分析到模型训练,amis 满足了各种各样的页面需求,最复杂的页面有超过 1 万行 JSON 配置。   amis前端低代码框架 更新日志: v1.1.7 Feature Wrapper 组件 style 支持动态获取 数据映射支持 cookie 获取 内置 filter 新增 map 方法 Rating 组件支持清空 Tabs 的 activeKey 支持变量 Excel 导出支持自定义文件名 数据映射的 key 可以支持 . 或者 [] 来指定路径 Tree-Selector 支持懒加载 升级 ECharts 到 5.1.1 升级 Monaco-Editor 到 0.24.0 Enhancement 升级 mst 到 3 的最新版本 开发使用 concurrently 避免新开一个窗口 data-link 优化 Wizard 组件新增 startStep 配置项 按钮 tooltip 整理,支持 disabledTip Each 组件空状态时文字居左,同时将空数组状态也认为是空状态 去掉 Tab line 模式下顶部的 padding Uuid 有值时不设置,没值自动设置 TextArea 组件最小行数限制 & 静态展示超出等 Form 远端校验显示报错时,可以再次提交 Nav 的 mapTree 需要 depthFirst Checkboxes 分组样式优化 DateTime-Range下拉增加 popoverClassName 属性,可以自定义弹框的 className; 父级有缩放比时弹框宽度计算问题修复; Date 快捷键支持上月底 autoFill 支持多选 CRUD 的 toolbar 默认不再将最后一个组件放右边 接口兼容多种 json 返回格式 CRUD filterable 判断是否选中不要那么严格 Button-Group disabled 统一使用透明度的方式来实现,不然无法区分选中状态是哪个 调整日期按钮位置顺序 和 Dialog 统一 Bugfix 修复 Audio should not call load method at first render 修复 文档多余描述 修复 CRUD filter Combo模式不能清空查询条件 修复 初始状态 autoFill 不同步的问题 修复 文档样例错误 修复 Audio 组件 src 属性不符合预期的行为 修复 表单联合校验问题 修复 PopOver 宽度计算问题 修复 图片表单项 disabled 影响放大功能的问题 修复 Transfer selectTitle resultTitle 不生效的问题 修复 Tree 组件问题 修复 Fiule 组件错误提示样式问题 修复 Select 组件自定义菜单模式下无法全选问题 修复 Number 最大最小值校验问题 修复 sdk 中 dialog 里的编辑器弹窗被遮挡问题 修复

87,904

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧