我有一个动态许多子表单的Angular表单。第一个表单在提交后不会被重置,子表单将在每次提交时重置。
如果用户没有重新加载页面,我们可以多次使用此整个表单。 因此,在验证并提交后,我不会重置第一个表单,但让用户再次点击它,他可以添加一些额外的子表单(如果没有任何更改)。
仅当用户单击submit时才会显示验证,因此范围变量subFormSubmitted变为true且所需错误仍然为true。 e.g。
subForm.salutation.$error.required && subFormSubmitted
首页加载 - 一切正常。当我尝试提交子表单而不输入某些内容时,会显示所需的验证。
问题是,在他第一次提交表格之后,他没有改变第一种形式的任何内容,他第二次进入动态表格,只需点击提交,而不输入任何内容,虽然范围变量具有正确的值,但模型不会更新并且不会显示验证。 变量
subForm.salutation.$error.required && subFormSubmitted
当我在webdeveloper中检查时,评估为true。但是,当我关注输入并输入内容时,所需的验证会立即显示在其他输入上。此外,当我在第一个表单中更改某些内容 - 然后输入子表单时,验证会在我按下提交时正确显示。
所以我想,这可能是应用范围的问题。
经过一些尝试和错误后我做了什么,我得到了一个有效的解决方案:
我添加了
if (!$scope.$$phase) {
$scope.$digest();
}
到我按下提交时调用的范围函数。
这很好用,但经过一些研究,我发现这是一种反模式: Why is using if(!$scope.$$phase) $scope.$apply() an anti-pattern?
所以,有人可以帮助我并告诉我"对"解决这个问题的方法?
基本上我用ng-show = firstFormSubmitted来控制表单的可见性。
$scope.addSubForm = function() {
$scope.firstFormSubmitted = true;
我希望你能理解我的问题,抱歉英语不好
答案 0 :(得分:0)
$scope.$apply
和$scope.$digest
意味着在异步运行的回调中执行(在初始摘要周期之后):AJAX请求,setTimeout
/ setInterval
/ {{1} },非setImmediate
承诺,DOM事件监听器等
Angular的工作是在所有异步内置函数($q
,$http
,指令)中自动执行它,并且它处理作业。有礼貌的第三方扩展也会做同样的事情。
$timeout
可被视为反模式的原因是,在形状良好的应用中,开发人员总是知道代码是否在摘要上执行,因此这种检查是多余的。如果不是,这就是应用程序设计中一些缺陷的指标。