6

有没有办法将 AngularJS 的 $log 注入到每个服务和控制器中?为每个人指定它只是感觉有点多余。

4

3 回答 3

2

另一种方法是向 rootScope 添加一个方法,然后通过控制器中的 $scope.$root 访问它,从而避免再次注入。我不知道它是否像全局一样糟糕。

testapp.js

(function(){
    'use strict';
    angular.module('app', [])
    .run(function($rootScope, $log) {
        $rootScope.log = function(msg){
            $log.info(msg);
        }
    })
    .controller('LogCtrl', ['$scope', function LogCtrl($scope) {
        $scope.logThis = function(msg){
            $scope.$root.log(msg);
        };
    }]);
})();

测试.html

<!doctype html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.0-beta.5/angular.min.js"></script>
  <script src="testapp.js"></script>  
</head>
<body ng-app="app">
<div ng-controller="LogCtrl">
  <p>Enter text and press the log button.</p>
  Message:
  <input type="text" ng-model="message"/>
  <button ng-click="logThis(message)">log</button>
</div>
</body>
</html>
于 2014-04-16T04:35:00.503 回答
1

如果不在函数参数中定义它,注入它对我来说似乎是不可能的。但是你可以让它可用:

var $log;
app.run(['$log',function(logService) {
   $log = logService;
}]);

app.controller('MainCtrl', function($scope, myService) {
    $log.warn('Controlling');
});  

app.service('myService', function() {
    $log.warn('Ha!');
    return {};
});

http://plnkr.co/edit/Zwnay7dcMairPGT0btmC?p=preview

另一种方法是将其设置为全局变量 ( window.$log),但我不会这样做。

于 2014-04-09T09:34:59.460 回答
0

对于那些认为使用 $rootscope 需要大惊小怪的人来说,这里有一个解决方案:将 $log 添加到 angular 对象中。

angular.module('myModule')
    .run(['$log', function($log) {
        angular.log = $log;
    }]);

然后,当您创建控制器时,不需要 $log。

angular.module('myModule')
     .controller('MyController', MyController);

MyController.$inject = []; // <-- see, no $log required!

function MyController() {
    angular.log.info("Hello world");
}

如果您希望进一步缩短它,您甚至可以更进一步并添加 angular.info = $log.info。

于 2016-08-22T07:45:51.927 回答