【问题标题】:Expose javascript errors in angular.js暴露 angular.js 中的 javascript 错误
【发布时间】:2015-05-23 04:36:20
【问题描述】:

在某些情况下,角度引擎不会输出原始 javascript 错误。例如

myapp.directive('helloWorld', function() {
return {
    scope: '@',
    restrict: 'AE',
    template: '<p ng-click="clearMessage2()">Hello, World! {{message}}</p>',
    link: function(scope, elem, attrs) {
       scope.clearMessage = function() {
          scope.message = '';
       }
   }
}});

当我单击使用指令生成的 p 元素时,我希望控制台中的错误说 clearMessage2() 未定义,但这不会发生并且检查事情的唯一方法是在 clearMessage 定义中使用 console.log 。

是否可以改变 angular.js 的这种行为并且不隐藏 JS 代码中发生的错误?

【问题讨论】:

  • 否 - 角度从 undefined 函数中将错误替换为 angular.noop

标签: javascript angularjs error-handling


【解决方案1】:

可以,但不推荐。问题是 Angular 并没有按原样执行 ng-click 指令中的方法(就像在常规 onclick 中一样),而是使用 $parse 服务评估表达式。来自角度文档:

Angular 不使用 JavaScript 的 eval() 来评估表达式。 相反,Angular 的 $parse 服务会处理这些表达式。

Angular 中表达式求值的实现是故意宽容的。

在 JavaScript 中,尝试评估未定义的属性会生成 ReferenceError 或 TypeError。在 Angular 中,表达式求值对 undefined 和 null 是宽容的。如果 a 未定义,则什么都不显示比抛出异常更有意义(也许我们正在等待服务器响应,它很快就会被定义)。如果表达式评估不宽容,我们将不得不编写使代码混乱的绑定

所以 $parseProvider 根本不会执行一个未定义的函数,而是执行一个 noop 函数(这是一个空对象模式的实现)。以下是 $parseFunctionCall 方法的摘录:

var fn = fnGetter(scope, locals, context) || noop;

空对象的执行将什么都不做,这就是正在发生的事情。你可以通过修改 $parseFunctionCall 来执行任何函数来实现你想要的,而不是执行 noop 函数。

更改代码似乎是唯一的选择,因为这些服务的配置不足以满足您的用例。但是,除非您非常了解 Angular API,否则我不认为这是推荐的方法。

补充阅读:

Angular expressions

$parse service

【讨论】:

  • 如果使用表达式会怎样,例如:ng-click="foo = 4"?这个解决方案失败了
  • 另外,据推测,OP 对函数表达式调用的更广泛解决方案感兴趣,而不是 ng-click
  • 是的,我对避免 Angular 拦截和隐藏任何 js 错误的广泛解决方案很感兴趣。我宁愿通过链接到它发生的文件的链接来获得正常的异常,而不是安静地吞下它
  • @DmitrySemenov,为什么会引起关注?
  • 你说的都是对的。我最初的答案是有缺陷的,并未涵盖所有情况。重写答案。
猜你喜欢
  • 2020-10-18
  • 2011-09-07
  • 2015-10-20
  • 1970-01-01
  • 2018-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-19
相关资源
最近更新 更多