2014-04-09 18 views
6

C'è un modo per iniettare il log $ di AngularJS in ogni servizio e controller? Mi sembra un po 'ridondante specificarlo per tutti.

risposta

1

Iniettare mi sembra impossibile senza definirlo nei parametri di funzione. Ma si può rendere disponibile:

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

Un altro modo sarebbe quello di impostarlo come una variabile globale (window.$log), ma io non lo farei.

+0

Quando si definisce 'var $ log' in un ambito globale si sta fondamentalmente impostando' window. $ Log' –

2

Un altro modo per farlo è aggiungere un metodo a rootScope e quindi accedervi tramite $ scope. $ Root nei controller, evitando così un'altra iniezione. Non so se è così male come i globali.

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

Abbastanza bello. Mi piace scrivere il mio controller senza mettere tutto sull'oscilloscopio usando la sintassi 'controller as' in modo che risultasse necessario iniettare $ scope in tutti loro ed è solo più semplice iniettare $ log. –

+1

Sembra quasi un aggiornamento - preferirei iniettare '$ log' dappertutto che digitare' $ scope. $ Root.log' e anche iniettare '$ scope' in posti che non ero prima (es.) ... Io passo –

0

Ecco una soluzione per coloro che pensano che l'uso del $ rootscope richiede troppa confusione: aggiungere il registro $ all'oggetto angolare.

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

Quindi quando si creano i controller, non è richiesto $ log.

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

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

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

Si potrebbe anche fare un ulteriore passo avanti e aggiungere angular.info = $ log.info se si desidera accorciare un po 'di più.

Problemi correlati