0

我无法将我的 $exceptionHandler 格式化为 strictdi。我正在尝试修改异常处理程序,以便将角度错误记录到我们的服务器并让我们知道某些页面崩溃。对于下面的代码,我遇到循环依赖错误。在下一组代码中,我得到了 strictdi 错误。请注意,我们使用 gulp 缩小代码。

此处的错误:找到循环依赖项:$rootScope <- $http <- serverlog <- $exceptionHandler <- $rootScope


var pageApp = angular.module('pageApp',['angular-oauth2','ngCookies']);

pageApp.factory("serverlog", serverlog);
serverlog.$inject = ["$http"];
function serverlog($http) {
    var svc = {};
    svc.add = function(exception) {
        var data = angular.toJson(exception);
        console.log("Sending to server errors");
        // console.log(data);
        // $.ajax({
        //  type: "POST",
        //  url: "/api/v1/jslog",
        //  contentType: "application/json",
        //  data: data
        // });
    };
    return svc;
}

pageApp.config(['$provide', function($provide) {
    $provide.decorator("$exceptionHandler", $exceptionHandler);
    $exceptionHandler.$inject = ['$delegate','serverlog'];
    function $exceptionHandler($delegate,serverlog) {
        return function(exception, cause) {
            $delegate(exception, cause);
            serverlog.add(exception);
        }
    };
}]);

然后对于这组代码,出现了 strictdi 错误:serverlog 没有使用显式注释,并且不能在严格模式下调用

pageApp.config(['$provide', function($provide) {
  $provide.decorator("$exceptionHandler", ['$delegate','serverlog', function($delegate,serverlog) {
    return function(exception, cause) {
        $delegate(exception, cause);
        serverlog.add(exception);
    }
  }]);
}]);
4

1 回答 1

0

要解决循环依赖关系,您可以注入$injector而不是serverlog在运行时解决依赖关系:

pageApp.config(['$provide', function($provide) {

  $provide.decorator("$exceptionHandler", $exceptionHandler);
  $exceptionHandler.$inject = ['$delegate', '$injector'];

  function $exceptionHandler($delegate, $injector) {

    var serverlog;

    return function(exception, cause) {

      serverlog = serverlog || $injector.get('serverlog');

      $delegate(exception, cause);
      serverlog.add(exception);
    };
  }
}]);

尝试了第二个示例,但无法复制 strictdi 错误。只要您对 serverlog 服务使用相同的代码,就应该给出与第一个示例相同的错误。

于 2017-01-26T05:11:52.143 回答