20

如果我有这样的 ng-click:ng-click="buggy()" 并单击控制台上不会生成任何错误消息。

这使得调试有点棘手。

为什么不生成错误消息?有什么我能做的吗?

4

1 回答 1

19

角度表达式

实际上,它并没有什么特别之处,它是角度表达式ng-click的默认行为。

buggy()不使用常规 javascript 进行评估。它是用 评估的$parse

$parse计算表达式并返回将针对范围运行的函数。

$parse仅在表达式无效时记录错误。

角度表达式评估是宽容的,我想不出任何方法来通过它。

为什么表情是宽容的?

Angular 表达式允许 undefined 和 null 的基本原理与数据绑定有关。当绑定变量被编译到 DOM 中时,它们最初可能是未定义的或为空的——一个非常明显的例子是绑定变量依赖于一个 Promise。Angular 团队决定,与其在承诺得到解决之前弹出错误消息,不如默默地继续。

Angular 指南到表达式

如果 a 未定义(也许我们正在等待服务器响应,它很快就会被定义),那么什么都不显示比抛出异常更有意义。如果表达式评估不宽容,我们将不得不编写使代码混乱的绑定,例如:{{((a||{}).b||{}).c}}

另请参阅:https ://groups.google.com/forum/m/#!topic/angular/HRVOUKEHLFw


角度表达式

表达式是类似 JavaScript 的代码片段,通常放置在 {{ expression }} 等绑定中。表达式由$parse服务处理。表达式通常使用过滤器进行后期处理,以创建更用户友好的格式。

Angular 表达式与 JS 表达式

将 Angular 视图表达式视为 JavaScript 表达式可能很诱人,但这并不完全正确,因为 Angular 不使用 JavaScript eval() 来评估表达式。您可以将 Angular 表达式视为具有以下区别的 JavaScript 表达式:

  • 属性评估:所有属性的评估都针对进行评估的范围,这与在 JavaScript 中针对全局窗口评估表达式不同。

  • Forgiving:表达式求值对 undefined 和 null 是宽容的,这与 JavaScript 不同,在 JavaScript 中尝试求值 undefined 属性会产生 ReferenceError 或 TypeError。

  • 没有控制流语句:您不能在角度表达式中执行以下任何操作:条件、循环或抛出。

于 2014-01-23T01:04:44.913 回答