【问题标题】:Angular controller sporadically not loading角度控制器偶尔不加载
【发布时间】:2015-03-06 10:57:23
【问题描述】:

我有一个使用 RequireJS 和 Angular 设置的网站,但在看似随机的时刻,它会决定不加载部分 Javascript 或不绑定部分 Angular 代码。

有问题的页面上有几个不同的组件,它们都有自己的角度控制器。大约 90% 的时间都可以正常加载,但有时会发生阻止数据绑定的事情(尖括号可见,ng-hide 不起作用,...)。此外,Chrome devtools 中的“网络”选项卡显示未加载任何文件,尽管它们已列在“源”中。我不知道这是否相关。我在控制台中完全没有错误。

在 JS 控制台中四处挖掘,我发现有问题的控制器之一确实存在(= 我使用 angular.element(...).scope() 获得了一个对象)但是当我尝试访问它的一个属性时,它们要么未定义,要么对于我在所有控制器中使用的init() 函数,它返回父控制器的函数。

什么可能导致控制器被加载但其范围变量在看似随机的时间未定义?

编辑: 我发现在控制台中不显示错误的情况下重现此问题的唯一方法是将控制器初始化为空函数。这会在控制台中产生类似的作用域行为,但不会导致角花括号出现。我会接受任何能引导我找到问题原因或可行解决方法的线索。

【问题讨论】:

  • 您是否使用一些 JavaScript 任务运行程序,例如 Grunt 或 Gulp 并使用单元测试,尤其是 E2E 测试来测试您的代码?如果你这样做了,那么这是一种有趣的行为。
  • 我使用 Grunt 连接和缩小所有 JS 文件,但没有测试。问题在于,这可能会在没有明显原因的情况下发生,即使是简单的页面刷新也可以将其关闭。
  • 首先,尝试验证 HTML 模板以查找任何错误,有时问题在于角度命名约定的拼写。如果没有帮助,我们将继续搜索。
  • 并设置测试环境。例如:karma、phantomJS 和 jasmine 风味测试。避免过早秃顶对您有很大帮助。
  • 需要指出的是,如果页面加载时开发工具未打开,chrome 开发工具中的网络选项卡不会显示网络流量。

标签: javascript angularjs requirejs angularjs-scope


【解决方案1】:

似乎 RequireJS 有时加载的速度足够快,可以在 DOM 完全加载之前执行 angular.bootstrap 调用。这导致角度处理已经加载的内容并忽略接下来的内容。因此,我在设置中添加了domReady 要求,因此我只在知道整个页面都存在时才引导角度。由于很难确定,我只能希望这是原因,并且我们不会再看到这个问题。

【讨论】:

  • 您实际上并没有给其他任何人足够的代码来处理,但只是为了确认您的怀疑,是的,这就是正在发生的事情。您偶尔会看到它,因为它是某种竞赛条件。如果你想让 RequireJS 加载 Angular 然后为你引导,你必须确保你的 dom 在 Angular 引导发生之前完成加载。
【解决方案2】:

您可能必须使用AngularAMD。非常适合我们的 Angular 网站。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-24
    • 2014-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多