当前位置: 首页 > 面试题库 >

如何覆盖Angular对无效表单值的过滤,从而迫使Angular将$ viewValue持久化为$ modelValue?

彭弘方
2023-03-14
问题内容

我需要能够暂时保留尚未完全验证的数据,然后在准备将其永久化时强制执行验证。但是Angular阻止了这一点。

我有一个表格。用户可以saveDraft()使用表单的早期版本,这些版本将保留在服务器上。然后,当用户准备就绪时,他们便可以使用submit()该表单,该表单将使用不同的标记来保留该表单,从而开始对该数据的实际处理。

我遇到的问题是Angular的内置验证。当用户将一些数据输入到带有验证的输入中时,该数据将缓存在$viewValue属性中。但是,如果验证失败,它将永远不会复制到该$modelValue属性,这是对$scope我将输入绑定到的实际属性的引用。因此,“无效”值将不会保留。

但是我们需要坚持下去。稍后,当用户commit()时,我们将迫使其纠正验证失败。此外,我们也没有办法知道用户是否会saveDraft()submit()在视图/控制器的特定实例,所以我们不能设置的意见和验证不同事前。

我的想法是,我们需要以某种方式迭代表单元素,并使Angular以某种方式使数据通过。但是我找不到一种灵活且可扩展的方法。

我已经尝试过设置$scope.formName.inputName.$modelValue = $scope.formName.inputName.$viewValue,但是这似乎使众神不安,因为随后两个值都被清空了。

我尝试使用$scope.formName.inputName.$setValidity('', true),但这只会更新UI状态。它永远不会触及$modelValue

我可以成功使用,$scope.model.boundPropertyName = $scope.formName.inputName.$viewValue但这感觉非常必要,并且不允许boundPropertyName和的标识符之间有任何差异inputName。换句话说,您要么为所有表单控件都需要单独的功能,要么需要依赖命名约定。两者都很脆。

所以…我怎样才能$modelValue优雅地更新它?和/或,是否有另一种更好的方法来获得相同的结果,从而有时我可以坚持进行验证,而有时可以坚持进行验证?

我正在考虑但不满意的其他选择:

  • 仅当用户点击submit()时,才手动运行验证。但这破坏了UI中即时内联验证的UX值。我们不妨将所有验证都卸载到服务器,然后每次都进行往返。
  • 制作ngModel和ngModelController的副本,并对其进行猴子补丁更新,$modelValue无论其有效性如何。但是,当应该有一条更优雅的道路时,这会破坏框架。

在此处查看CodePen。

(旁注:Angular似乎正在根据验证器在 两个方向上
对数据进行过滤。如果在模型上为formData.zip设置默认值‘1234’,则该字符不足以验证字符,Angular不会这样做。甚至不显示它。它永远不会到达初始$viewValue。)


问题答案:

从Angular 1.3版本开始,可以使用以下解决方案

您可以ng-model-options="{ allowInvalid: true }"在模型的输入字段中设置要保留无效属性的位置。

allowInvalid:布尔值,指示可以使用未正确验证的值来设置模型,而不是将模型设置为未定义的默认行为

https://docs.angularjs.org/api/ng/directive/ngModelOptions

然后,当您准备向用户显示其验证错误时,您可以按照自己的方式进行操作。只要记住要给您的输入和表单name属性,以便您可以在自己的范围内引用它们即可。

例如 if($scope.myFormName.my_input_name.$invalid) { ... }

相关教程:http :
//blog.thoughtram.io/angularjs/2014/10/19/exploring-angular-1.3-ng-model-
options.html



 类似资料:
  • 我正在编写一个独立的java应用程序,从Maven项目构建它并通过调用jar文件执行。 在应用程序中,我有一个实体管理器,它使用在我的持久性中定义的持久性单元。xml是独立的(事务类型=“RESOURCE\u LOCAL”) 实际的实体注释类来自另一个项目,因此被添加到pom中。xml文件作为依赖项。 问题是持久性。包含实体类的项目的xml覆盖了实际独立应用程序的持久性。构建jar时,jar目标文

  • 我用这个函数从后端获取数据 和显示JSON,如下所示 我需要的是具有的数据,为此我创建 这部分代码显示为空。 请问如何使用

  • 显示相同数据的多个组件 访问数据的单一服务 现在,当通过Observables接收数据时,我有两种选择: a)订阅observable以获取一次数据,并再次订阅以获取更新

  • 问题内容: 我正在尝试使用ModelForm添加数据。它工作正常,除了ForeignKey下拉列表显示所有值,我只希望它显示与已登录用户相关的值。 这是我要添加的记录ExcludedDate的模型: 这是类别的模型,该表是包含我想由用户限制的关系的表: 最后,表单代码: 如何获取仅显示类别子集的表单,其中category.user等于登录用户? 问题答案: 您可以在 init中* 自定义表格 *

  • 通常所有的默认配置都可以。但是现在我需要将我的应用程序部署到Weblogic 12.2服务器,我面临一些关于持久性的问题。 我只是想知道如何设置持久化单元的JPA EntityManagerFactory不默认。因为通过启动应用程序,我可以看到这些日志: 所以我不确定weblogic是使用默认的持久化单元(eclipselink)还是真正的Hibernate。所以我想在我的应用程序中的任何地方明确

  • 使用Struts 1.3 我有一个带有用户名、密码的登录表单,还有一个带有一些值的下拉列表,比如English、Deutsh等等。提交表单时,需要从下拉列表中保留最后一个值。 遵循代码示例。 JSP代码: 现在,此JSP代码生成以下下拉列表: struts配置。xml 问题: 现在的问题是,当我输入无效的用户名、密码并选择德语时。最后选择的语言应保持不变,并显示在下拉列表中。但下拉列表已初始化,值