2014-04-09 11 views
6

Gibt es eine Möglichkeit, AngularJS $ Log in jedem Service und Controller zu injizieren? Es fühlt sich einfach ein wenig überflüssig an, es für jeden zu spezifizieren.

Antwort

1

Injizieren scheint mir unmöglich, ohne es in den Funktionsparametern zu definieren. Aber man kann es zur Verfügung stellen:

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

Eine weitere Möglichkeit, es als eine globale Variable zu setzen wäre (window.$log), aber ich würde das nicht tun.

+0

Wenn Sie 'var $ log' in einem globalen Bereich definieren, setzen Sie im Grunde' window. $ log' –

2

Eine weitere Möglichkeit ist, eine Methode zum rootScope hinzuzufügen und dann über $ scope. $ Root auf Ihre Controller zuzugreifen und so eine weitere Injektion zu vermeiden. Ich weiß nicht, ob es so schlimm ist wie Globals.

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); 
     }; 
    }]); 
})(); 

test.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> 
+2

Ganz nett. Ich mag es, meinen Controller zu schreiben, ohne alles auf den Bereich zu setzen, indem ich die "Controller als" -Syntax benutze, so dass ich $ scope in alle von ihnen injizieren muss und es einfach einfacher ist, $ log zu injizieren. –

+1

Scheint kaum wie ein Upgrade - ich würde lieber '$ log' injizieren, als' $ scope. $ root.log' einzugeben und '$ scope' auch an anderen Stellen einzufügen (zB: isoliere Bereichsdirektiven)) ... Ich werde vorbeigehen –

0

Hier ist eine Lösung für diejenigen, die denken, dass die $ rootscope mit zu viel Aufwand erfordert: fügen Sie das Protokoll $ zu dem eckigen Objekt.

Wenn Sie Ihre Controller erstellen, ist kein $ log erforderlich.

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

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

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

Sie könnten sogar einen Schritt weiter gehen und hinzufügen angular.info = $ log.info, wenn Sie es ein wenig mehr kürzen möchten.

Verwandte Themen