在ng-repeat表Angularjs中捕获重复的异常

时间:2017-09-20 12:03:27

标签: angularjs exception-handling

我尝试在每次在表中注册副本时通知用户。我想抓住:Error: [ngRepeat:dupes]并在继续之前提醒用户。以下是向表中添加元素的控制器方法:

$scope.addProdukt = function (item) {
    kladdValidationService.checkTable(); 
    try {
        $scope.addedResult.push(item); // works fine
        logService.info('Produktet er lagt til i tabellen'); 

    } catch (e) {
        console.log(e.stack); 
        console.log($exceptionHandler(e)); // neither of these two work
    }
    console.log($scope.addedResult);
};

每次我将已添加的项目推送到表格时,控制台中的Error: [ngRepeat:dupes]输出。 Juswt不确定如何抓住它。

4 个答案:

答案 0 :(得分:2)

未捕获错误的原因是因为将副本推送到数组中是完全有效的,并且不会导致异常。例外情况发生在ng-repeat指令中。

如果您希望在尝试添加重复内容时通知您的用户,请尝试以下操作:

$scope.addProdukt = function (item) {
    if(addedResult.indexOf(item) != -1){
        console.log("You tried to add a duplicate");
    }else{
         $scope.addedResult.push(item);
    }
}

如果您想警告用户有关副本,但仍然让他们有重复项,那么您可以通过在track by $index中添加ng-repeat在html中显示它 即:

<div ng-repeat="item in $scope.addedResult track by $index">
</div>

答案 1 :(得分:0)

您可以尝试以下方法:

跟踪$ index 始终删除重复的

<div ng-repeat="n in [42, 42, 43, 43] track by $index">
  {{n}}
</div>

答案 2 :(得分:0)

  

我想抓住:错误:[ngRepeat:dupes]并在继续之前提醒用户。

向用户显示您的代码因异常而崩溃?

捕获代码的异常并通知用户这是不好的做法。请记住,在Error: [ngRepeat:dupes]之后 - 您的代码无法正常运行!它可能导致意外的行为。摘要循环停止等等。

我强烈建议您编写逻辑,在数组中搜索重复的ID并通知用户。

请勿根据需要使用Angular Exception流程!

无论如何,如果你想管理异常,你可以捕获覆盖$exceptionHandler

例如:

app.config(function($provide) {

   $provide.decorator("$exceptionHandler", function($delegate, $injector) {
    return function(exception, cause) {

            var data = {
                message: "Exception: " + exception.message,
                stack: exception.stack || "none"
            };

             // manage your exception
             alert(JSON.stringify(data));


            // Call The original Angular Exception Handler
            $delegate(exception, cause);

       };
   });

});

Demo Plunker

您可以注入一些服务并在其中传递所有异常数据:

// ...
var someService = $injector.get("SomeService"); 

someService.reportClientError(data).then(function(data) {
               //...
            }, function(error) {
                //...
            }); 

答案 3 :(得分:0)

这方面的东西?不幸的是,我现在无法测试这个,但核心来自描述如何记录异常的anguarJS示例代码

angular.
module('exceptionOverwrite', []).
factory('$exceptionHandler', [function() {
var exceptions = [];
return function myExceptionHandler(exception, cause) {
   if(exceptions.indexOf(exception) !== -1) 
    {// its duplicate do your thing
     }
   this.exceptions.add(exception)
};
}]);