在某些情况下,角度引擎不会输出原始数据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使用指令生成的元素我希望控制台中出现错误清除消息2()未定义,但这不会发生,检查事情的唯一方法是在clearMessage定义中使用console.log。
是否可以改变 angular.js 的行为并且不隐藏 JS 代码中发生的错误?
这是可能的,但不推荐。问题是 Angular 不会按原样执行 ng-click 指令中的方法(就像常规 onclick 中一样),而是使用$parse服务。来自角度文档:
Angular 不使用 JavaScript 的 eval() 来计算表达式。
相反,Angular 的 $parse 服务会处理这些表达式。
Angular 中表达式求值的实现是故意宽容的。
在 JavaScript 中,尝试计算未定义的属性会生成 ReferenceError 或 TypeError。在 Angular 中,表达式求值可以容忍 undefined 和 null。如果 a 未定义,那么什么都不显示比抛出异常更有意义(也许我们正在等待服务器响应,它很快就会被定义)。如果表达式求值不宽容,我们就必须编写使代码混乱的绑定
因此 $parseProvider 根本不会执行未定义的函数,而是会执行noop函数(它是空对象模式的实现)。这是摘录自$parseFunctionCall method:
var fn = fnGetter(scope, locals, context) || noop;
空对象的执行不会执行任何操作,这就是正在发生的情况。您可能可以通过修改 $parseFunctionCall 来执行任何函数而不是执行 noop 函数来实现您想要的目的。
更改代码看起来是唯一的选择,因为这些服务的配置不足以满足您的用例。但是,我不认为这是推荐的方法,除非您非常了解 Angular API。
如需补充阅读:
角度表达式 https://docs.angularjs.org/guide/expression
$解析服务 https://docs.angularjs.org/api/ng/service/%24parse
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)