javascript - AngularJS:在带有 $timeout 的摘要循环后运行(Safari 与 chrome)

标签 javascript angularjs

我在填写表单时编写了一些自定义验证代码,但需要将 $timeout 设置为 > 100 毫秒才能使其正常工作,我很好奇找到找出原因。

所需的表单元素遵循此格式。如果输入错误,我添加“novalidate”类:(观察,表单中有大量这些元素)

<div class="dottedWrapper" ng-class="{novalidate:(newController.jobDescription.length == 0) && newController.formSubmitted}">

提交表单时,我检查是否有任何元素具有“novalidate”类并返回。

 self.formSubmitted = true;

    $timeout(function () {

        // Validate! 
        if (document.getElementsByClassName("novalidate").length > 0) {
            return;
        }

        ... 

       }, 100); // MUST SET AT LEAST 100ms for it to work in safari

但是,只有当我在 Safari 中将时间设置为大约 100 毫秒以上时,这才有效。在chrome中,只需将其设置为1ms即可。

如果我错了,请纠正我,但这是我的想法,请记住我是 Angular 新手:

  1. 我在开头设置了“self.formSubscribed = true;”。这会导致通过双向数据绑定(bind)对所有 div 进行更新,因为“formSubscribed”包含在 ng 类内。

  2. 这是通过摘要循环完成的,这意味着我无法在摘要循环大多数运行一次并更新所有内容之后直接运行“document.getElementsByClassName("novalidate")” 。

  3. 所以...我使用$timeout,认为它会让当前的摘要循环运行,然后跳转到下一个摘要循环。此时,所有元素都应该更新。

最佳答案

您正在破坏 MVC 模式。不要这样做 - 这是不好的做法。

你为什么不这样做:

if (self.jobDescription.length == 0 && self.formSubmitted)
    return;

关于javascript - AngularJS:在带有 $timeout 的摘要循环后运行(Safari 与 chrome),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33561536/

相关文章:

javascript - jqgrid - 为什么在 jquery.ajax 之后(类型 :html) then jqgrid reload event not working?

Javascript - 简单密码强度指示器

javascript - 在javascript函数中切换传入变量 boolean 值

angularjs - 在自定义指令中禁用 ngClick 事件处理

angularjs - 如果在 DomContentLoaded 中初始化,为什么要在底部声明 AngularJs

javascript - 为什么 am 图表导出顶部的饼图/图例黑色?

javascript - 同位素 - 单击以展开图像并在左上角定位

javascript - 使用 es6 将嵌套对象中的 props 合并为一个对象

javascript - Firebase .constant 无法正常工作

javascript - 在选择列表angular js中获取所选选项的选项文本