为什么不在控制台中显示html中的AngularJS错误?

时间:2014-10-07 02:12:10

标签: javascript html angularjs debugging

此处以a fiddle为例。当有一个ng-click指令(例如)调用未在控制器的$ scope(或其父节点)上定义的函数时,它会无声地失败。当我试图调试网页时,这种行为令人抓狂,因为错误输入的函数名称可能意味着浪费了很多时间。我怎样才能找出这样的错误被误吞的原因,为什么答案是"你不能?"


HTML

<div ng-app="AngularApp">
    <div ng-controller="FooController">
        <button ng-click="noError()"> noError() </button>
        <button ng-click="error()"> error() </button>
        <button ng-click="works()"> works() </button>
        <br/>
        <p ng-bind="foo"></p>
    </div>
</div>


的Javascript

var angularApp = angular.module('AngularApp', []);

angularApp.controller('FooController', ['$scope', function($scope) {
    $scope.foo = 0;

    $scope.works = function () {
        $scope.foo += 1; // no error, everything works
    };

    $scope.error = function () {
        $scope.foo += baz; // ReferenceError: baz is not defined
    };

    // noError is not defined in the controller, so errors suddenly don't matter?
}]);

1 个答案:

答案 0 :(得分:9)

为什么ngClick不会在错误引用上抛出引用错误

ngClick默认使用隐私下的$parseYou can see that in the source here

$parse是一个角度辅助函数,用于解析角度表达式。

您可以阅读有关表达式in the documentation的规则,但相关的代码段如下所示。

  

Angular表达式与JavaScript表达式   Angular表达式就像JavaScript表达式,但有以下不同之处:

     
      
  • 上下文:JavaScript表达式是针对全局窗口进行评估的。在Angular中,表达式是根据范围对象进行评估的。
  •   
  • 原谅:在JavaScript中,尝试评估未定义的属性会生成ReferenceError或TypeError。在Angular中,表达式求值是对undefined和null的宽容。
  •   
  • 无控制流语句:您不能在Angular表达式中使用以下内容:条件,循环或异常。
  •   
  • 过滤器:您可以在表达式中使用过滤器在显示数据之前格式化数据。
  •   

你怎么解决这个问题?

然后,文档会预测您的异议并以

响应
  

如果要运行更复杂的JavaScript代码,则应将其设置为控制器方法并从视图中调用该方法。如果你想自己eval()一个Angular表达式,请使用$ eval()方法。

所以基本上这个想法是表达式用于简单的代码,任何复杂的逻辑都应该用控制器运行。在你的情况下,你并没有真正做复杂的事情,只是做了不好的引用,但似乎从Angular的观点来看,答案是简单的#34;更加自律。&#34;并构建您的代码以确保您的引用至少存在。

为什么这样做?

这已经被大部分覆盖,但实质上,表达式旨在处理非常简单的逻辑,并且为了简单而优化而不是破坏您的应用程序。这个想法是任何需要更广泛的错误检查的东西都可以在代码中处理。