在某些情况下,角度引擎不会输出原始 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代码中发生的错误?
答案 0 :(得分:4)
有可能,但不推荐。问题是angular不会按原样执行ng-click指令中的方法(就像常规onclick一样),而是使用 $ parse 服务来计算表达式。从角度doc:
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,否则我认为这不是一种推荐的方法。
进一步阅读: