Decorate Angular $ log to use a service using $ http

I am trying to extend the service $logso that it also sends a message to the server. I get an Angular "Circular Dependency Found" error message because it $httpuses $log.

app.js:

angular.module("app").config(function($provide) {
    $provide.decorator("$log", function($delegate, NodeLogger) {
        var logFn = $delegate.log;
        $delegate.log = function(message) {
            NodeLogger.log(message);
            logFn.apply(null, arguments);
        };
    });
});

NodeLogger.js:

angular.module("app").factory("NodeLogger", function($http) {

    function log(type, message) {
        var logMessage = type + ":" + message;
        $http.post("http://localhost:3000/log", "message=" + logMessage);
    }

    return {
        log: log
    }
});

I tried using $injectorin app.jsto download $httpand just make a request POST, but it gives the same error. Is there any way around this? Can i use $http/ $resource?

Thanks!

+4
source share
1 answer

, $http $log , , factory NodeLogger, inturn $http, . , factory, factory , - $injector factory $http $http. , factory. $delegate, $log - .

$provide.decorator("$log", function($delegate, $injector) {
    var logFn = $delegate.log;
    $delegate.log = function(message) {

      //Get NodeLogger factory instance from injector
      var NodeLogger = $injector.get('NodeLogger');
      NodeLogger.log(message);
      logFn.apply(null, arguments);
    };
    //Return the delegate
    return $delegate;
  });

angular.module("app", []).factory("NodeLogger", function($http) {

  function log(type, message) {
    var logMessage = type + ":" + message;
    $http.post("http://localhost:3000/log", "message=" + logMessage);
  }

  return {
    log: log
  }
}).config(function($provide) {
  $provide.decorator("$log", function($delegate, $injector) {
    var logFn = $delegate.log;
    $delegate.log = function(message) {
      var NodeLogger = $injector.get('NodeLogger');
      NodeLogger.log(message);
      logFn.apply(null, arguments);
    };
    return $delegate;
  });
}).run(function($log) {
  $log.log("Hey");
});;
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js"></script>

<div ng-app="app"></div>
Hide result
+4

Source: https://habr.com/ru/post/1605659/


All Articles