Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
AngularJS循环依赖_Angularjs_Circular Dependency - Fatal编程技术网

AngularJS循环依赖

AngularJS循环依赖,angularjs,circular-dependency,Angularjs,Circular Dependency,我正在创建一个日志服务,通过将错误(或调试,如果启用)保存到indexedDB数据库中来扩展angular的$log服务。代码如下: angular.module('appLogger', ['appDatabase']) .service('LogServices', function($log, Database) { // ... this.log = function(type, message, details) { var log = {};

我正在创建一个日志服务,通过将错误(或调试,如果启用)保存到indexedDB数据库中来扩展angular的$log服务。代码如下:

angular.module('appLogger', ['appDatabase'])

.service('LogServices', function($log, Database) {

    // ...

    this.log = function(type, message, details) {
        var log = {};
        log.type = type
        log.context = this.context;
        log.message = message;
        log.dateTime = moment().format('YYYY-MM-DD HH:mm:ss');
        log.details = details || '';
        $log[type.toLowerCase()](log);

        if (type === 'ERROR' || this.logDebug) {
            Database.logSave(log);
        }
    };

    // ...
})
这在我的服务中起到了预期的作用。现在的问题是我不能在数据库服务中使用我的记录器,因为它抛出了一个循环依赖错误。我理解这个问题,但我不知道该如何解决它。。。我该怎么解决这个问题


感谢您的帮助:-)

Angular抱怨循环依赖的原因是……嗯,有一个。
这是一条非常危险的道路,但如果你知道自己在做什么(著名的临终遗言),那么有一个解决方案可以绕过这一点:

.service('LogServices', function($log, $injector) {

    // ...

    var Database;   // Will initialize it later

    this.log = function(type, message, details) {
        /* Before using Database for the first time
         * we need to inject it */
        if (!Database) { Database = $injector.get('Database'); }

        var log = {};
        log.type = type
        log.context = this.context;
        log.message = message;
        log.dateTime = moment().format('YYYY-MM-DD HH:mm:ss');
        log.details = details || '';
        $log[type.toLowerCase()](log);

        if (type === 'ERROR' || this.logDebug) {
            Database.logSave(log);
        }
    };

    // ...
})
另请参见此

参见评论中特别是彼得的问题,其中讨论了几乎完全相同的问题

Misko的答案是(使用Java代码)

所以在你的申请中,你有

.service('Database', ...) // DO NOT inject the $log or LogServices here

.service('LogServices', function($log) {...}) // DO NOT inject Database here

.service('LoggingDB', function(Database, LogServices) {...}) 
在应用程序的每个部分使用LoggingDB,您需要一个记录日志的数据库。(或者是使用数据库的记录器!)

另一个想法


您如何在浏览器上拥有一个数据库?数据库是$http或$resource之类的包装器吗?如果是这样的话,我同意ExpertSystem的选择:不要使用$http记录错误,因为如果错误杀死$http怎么办?改用XMLHTTPRequest。请参阅以获取一些讨论。

我在尝试重写异常处理程序时遇到了这个问题

这是出现问题的代码

angular
    .factory('$exceptionHandler', ExceptionHandler);

function exceptionHandler($log, sweetAlert) {// here is the problem with injecting sweetAlert
    return function myExceptionHandler(exception, cause) {
        //logErrorsToBackend(exception, cause);
        sweetAlert.swal('Opps...', 'An error has occurred');
        $log.warn(exception, cause);
    };
}
为了解决这个问题,我使用了
injector

angular
    .factory('$exceptionHandler', ExceptionHandler);

ExceptionHandler.$inject = ['$injector']; //better for minification

function ExceptionHandler($injector) {
    var $log, sweetAlert, $translate;// use variables for caching

    return function exceptionHandler(exception, cause) {
        // Add DI here to prevent circular dependency
        $log = $log || $injector.get('$log');
        sweetAlert = sweetAlert || $injector.get('sweetAlert');
        $translate = $translate || $injector.get('$translate');
        //............
    }
这里有更多信息的链接


希望这对您有所帮助

请看一下我对类似问题的回答:谢谢,它是这样工作的。现在你认为安全的道路是什么?为什么这条路很危险?你能详细说明一下吗?我非常愿意以有角度的方式做事,如果可能的话,不要使用黑客。问题是,我还有其他选择吗?危险的事情是进入一个无限循环,这将摧毁你的应用程序(Angular正试图首先保护你)。如果您想看到这一点,请转到我的演示并取消注释行
service1.service()
的“角度”方法不是创建循环依赖关系(在这种情况下,我认为yu不能,因为你需要
数据库
来提供
日志服务
,你还想在
数据库
中提供
日志服务
(这本身就是一个悖论:)。如果你想“稳妥行事”,我看到两个选项:1.)对于
数据库
,使用更简单的日志机制(不依赖
数据库
)。2.)对于
日志服务
和应用程序的其余部分,不要使用相同的
数据库
服务。使用更简单的
LogDatabase
服务(不在
LogServices
上)传递到
LogServices
,并在应用程序的其余部分使用当前的
数据库
服务(可以安全地使用
LogServices
进行日志记录)。(我希望这是有意义的:P)我想我必须手动保存错误,而不是依赖数据库服务。我不能用另一种方法来解决这个问题,因为数据库服务是一个很大的服务,因此严重依赖于日志记录。该死,我以为会有其他选择。无论如何,谢谢你提醒我:)
angular
    .factory('$exceptionHandler', ExceptionHandler);

ExceptionHandler.$inject = ['$injector']; //better for minification

function ExceptionHandler($injector) {
    var $log, sweetAlert, $translate;// use variables for caching

    return function exceptionHandler(exception, cause) {
        // Add DI here to prevent circular dependency
        $log = $log || $injector.get('$log');
        sweetAlert = sweetAlert || $injector.get('sweetAlert');
        $translate = $translate || $injector.get('$translate');
        //............
    }