如何将烤面包机库注入日志模块而不在异常处理程序中出现循环依赖错误

2023-12-22

我已将 AngularJS-Toaster 库添加到我的 index.html 中:

<link href="lib/angularjs-toaster/toaster.min.css" rel="stylesheet" />
<script src="lib/angularjs-toaster/toaster.min.js"></script>
<toaster-container 
  toaster-options="{'position-class': 'toast-bottom-center'}">
</toaster-container>

在我的角度应用程序中:

//app.js
(function () {
    angular
        .module('app', ['toaster','blocks.logger',/*etc*/]);
})();

//blocks/logger/logger.module.js
(function () {
    angular.module('blocks.logger', ['toaster']);
})();

//blocks/logger/logger.js
(function () {
'use strict';

angular
    .module('blocks.logger')
    .factory('logger', logger);

logger.$inject = ['$log', 'toaster'];

function logger($log, toaster) {

    var service = {
        error: error,
        info: info,
        success: success,
        warning: warning,

        log: $log.log  // straight to console;
    };

    return service;

    function error(message, title, data) {
        toaster.error({ title: title || 'Error', body: message, timeout: 6000 });
        $log.error(message, data);
    }
    //etc
}());

但是当我这样做时,我从注入器中收到循环依赖错误:Uncaught Error: [$injector:cdep]

我究竟做错了什么?

EDIT我发现问题与我使用的异常处理程序有关:

//code lifted from https://github.com/johnpapa/ng-demos (modular)
(function () {
    'use strict';

    angular
        .module('blocks.exception')
        .provider('exceptionHandler', exceptionHandlerProvider)
        .config(config);

    function exceptionHandlerProvider() {
        /* jshint validthis:true */
        this.config = {
            appErrorPrefix: undefined
        };

        this.configure = function (appErrorPrefix) {
            this.config.appErrorPrefix = appErrorPrefix;
        };

        this.$get = function () {
            return { config: this.config };
        };
    }

    function config($provide) {
        $provide.decorator('$exceptionHandler', extendExceptionHandler);
    }

    //function extendExceptionHandler($delegate, exceptionHandler, logger) {
    function extendExceptionHandler($delegate, exceptionHandler) {
        return function (exception, cause) {
            var appErrorPrefix = exceptionHandler.config.appErrorPrefix || '';
            var errorData = { exception: exception, cause: cause };
            var logMessage = appErrorPrefix + exception.message;
            $delegate(exception, cause);

            //logger.error(logMessage, errorData);
        };
    }
})();

通过注释掉记录器的使用,我可以在其他地方使用日志记录。但我也想在这里使用我的记录器。那么这是怎么回事以及如何解决它?


我找到了一个解决方案 - 使用$injector在异常处理程序中:

//blocks/exception/exception.module.js
(function () {
    'use strict';
    angular.module('blocks.exception', ['blocks.logger']);
})();

//blocks/exception/exceptionHandlerProvider.js
(function () {
    'use strict';

    angular
        .module('blocks.exception')
        .config(exceptionConfig);

    exceptionConfig.$inject = ['$provide'];

    function exceptionConfig($provide) {
        $provide.decorator("$exceptionHandler", exceptionHandler);
    }

    exceptionHandler.$inject = ['$delegate', '$injector'];

    function exceptionHandler($delegate, $injector) {
        return function (exception, cause) {
            var logger = $injector.get('logger');
            logger.error(exception.message);
            $delegate(exception, cause);
        };
    }

})();

参考:

具有服务依赖的 $log 装饰器会导致循环依赖错误 https://stackoverflow.com/questions/23416924/log-decorator-with-a-service-dependency-causes-circular-dependency-error

Angular 风格指南 - 例外 https://github.com/johnpapa/angular-styleguide#exception-handling

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将烤面包机库注入日志模块而不在异常处理程序中出现循环依赖错误 的相关文章

随机推荐

  • HTC WildFire 上的 SharedPreferences EditText 对话框被挤压

    我在我的 Android 应用程序中以标准方式使用 SharedPreferences 在 HTC WildFire 设备 分辨率 240x320 上 显示虚拟键盘时 EditText 会被挤压 有没有其他人遇到过这个 有解决办法吗 我已经
  • 验证日期序列的顺序是否正确

    我有一个包含 4 列日期的数据框 应该是 col1 首先出现 col2 其次出现 col3 第三出现 col4 最后出现 我想确定哪些行的日期不按顺序排列 这是一个玩具数据框 col1 lt c as Date 2004 1 1 as Da
  • 如何仅导入存在的模块?

    我正在做 降临代码 这是 25 个编程问题的集合 每一天对应一个 我在自己单独的文件 模块中构造每一天 因此例如 2021 年第 7 天将位于src years year2021 day07 rs So src years year2021
  • AngularJS - 如何向服务器上的控制器提交表单?

    食谱表格示例AngularJS 网站 http www AngularJS org只在客户端保存状态 如何提交到服务器 或者 我如何使用 jQueryform submit 在表格中的ng click save 功能 编辑 找到了 2 种方
  • 比较循环数组中的元素(java)

    我正在尝试制定一个 for 循环 该循环将采用一个数组 例如 5 个元素 并且允许我处理a 0 仿佛是在之后a 4 and a 4 就像以前一样a 0 我无法更改数组 并且它在每个元素中存储一个线程 因此我宁愿使其尽可能简单 以免损坏线程的
  • Qt 以最佳质量调整图像大小

    任何人都可以帮助我在 qt 中调整图像大小而不使图像像素化 这是我的代码 结果不如原来的质量 谢谢 QImage img name QPixmap pixmap pixmap pixmap fromImage img scaled widt
  • 用于游戏编程的 C++ - 爱还是不信任? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 以游戏编程效率的名义 一些程序员不信任某些 C 功能 我的一位朋友自称了解游戏行业的运作方式 并会提出以下评论 不要使用智能指针 游戏中没有人这
  • 我需要手动释放CFStringRef吗?

    您能告诉我在非 ARC 世界中哪种方法是正确的以及为什么吗 NSString getUUID CFUUIDRef theUUID CFUUIDCreate NULL CFStringRef string CFUUIDCreateString
  • 如何以及何时为 graphql 生成 ID?

    我正在将 graphql 与 SQLite 数据库连接 在 sql 中 id 是整数 但在 graphql 中 id 是字符串 经过搜索 基于这个问题 何时使用 GraphQLID 而不是 GraphQLint https stackove
  • BigQuery 表数据导出

    我正在尝试从中导出数据BigQuery使用 python api 的表 表包含 1 到 4 百万行 所以我一直保留着maxResults参数最大 即 100000 然后分页 但问题是 在一页中我只获得 2652 行 因此分页数量太多 谁能提
  • 如何从文件夹中删除 SVN [重复]

    这个问题在这里已经有答案了 可能的重复 如何删除文件夹的 Subversion 控制 https stackoverflow com questions 154853 how do you remove subversion control
  • response.setContentType() 总是修剪“; charset”之间的空格?

    我正在使用 Tomcat 6 0 20 HttpServlet 我的 servlet 代码如下 response setContentType application xml charset utf 8 但每次我都会得到内容类型为 appl
  • 文件上传对话框第一次不显示onclick

    一旦用户点击不透明图像的一部分 我们正在显示文件上传对话框 我们有 2 个彼此重叠的图像 如下所示 Issue 在上面的两张图片中 无论我点击非传输部分 都会显示文件上传对话框 但是如果我们点击重叠部分 而不是不显示 但是如果我们单击重叠部
  • 获取 PHP 中调用函数的名称?

    是否有 PHP 函数可以找出给定函数中调用者函数的名称 See 调试回溯 http php net manual en function debug backtrace php 这可以跟踪您的调用堆栈一直到顶部 以下是接听来电者的方法 tr
  • 导入错误没有名为 zlib 的模块(brew 安装了 python)

    当我在 python 2 7 的brew 安装版本上使用 pip freeze 时 出现导入错误 没有名为 zlib 的模块 pip freeze Traceback most recent call last File usr local
  • 如何找到哪个事务导致“等待表元数据锁定”状态?

    我正在尝试在表上执行一些 DDLSHOW PROCESSLIST导致 等待表元数据锁定 消息 我怎样才能知道哪笔交易尚未结束 我正在使用 MySQL v5 5 24 适用于 MySql 版本 SHOW ENGINE INNODB STATU
  • 我似乎无法在 html5 canvas 上画线

    我正在使用 HTML5 来绘制一条线 但当画布的宽度和高度较大时 它在 chrome 中无法正常工作 我使用的是 chrome 19 0 1084 52 我的操作系统是 windows 7 有谁用过吗http www w3schools c
  • sqlalchemy 中的多个/分割类关联

    我定义了以下对象和关系 这实际上是一个非常简单的案例 我提供所有这些字段只是为了说明为什么我认为吸入麻醉和注射麻醉应该由两个不同的类别定义 class InhalationAnesthesia Base tablename inhalati
  • 在屏幕上居中弹出窗口?

    我们怎样才能将通过 JavaScript 打开的弹出窗口居中window open屏幕中央的功能 确切的x and y哪个坐标取决于当前屏幕分辨率 单 双显示器功能 归功于http www xtf dk http www xtf dk 谢谢
  • 如何将烤面包机库注入日志模块而不在异常处理程序中出现循环依赖错误

    我已将 AngularJS Toaster 库添加到我的 index html 中