2014-04-09 10 views
6

Czy istnieje sposób na wprowadzenie AngulaJS $ log do każdej usługi i kontrolera? Po prostu wydaje się trochę zbędny, określając go dla każdego.

Odpowiedz

1

Wstrzyknięcie wydaje mi się niemożliwe bez zdefiniowania go w parametrach funkcji. Ale można udostępnić go:

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

Innym sposobem byłoby, aby ustawić go jako zmienną globalną (window.$log), ale tego nie zrobił.

+0

Kiedy definiujesz 'var $ log' w zasięgu globalnym, w zasadzie ustawiasz' window. $ Log' –

2

Innym sposobem, w jaki można to zrobić, jest dodanie metody do rootScope, a następnie dostęp do niej za pomocą $ scope. $ Root w kontrolerach, co pozwala uniknąć kolejnego zastrzyku. Nie wiem, czy jest tak źle, jak globale.

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

Całkiem miło. Lubię pisać swoje kontrolery bez umieszczania wszystkiego w zasięgu używając składni "kontroler jako", więc okazuje się, że muszę wstrzyknąć $ scope do wszystkich z nich i po prostu łatwiej jest wprowadzić $ log. –

+1

Prawie nie wydaje się uaktualnieniem - wolałbym wstawić '$ log' wszędzie, niż trzeba wpisać' $ scope. $ Root.log', a także wstrzykiwać '$ scope' w miejscach, w których wcześniej nie byłem (np .: izolować dyrektywy zasięgu) ... Przekażę –

0

Oto rozwiązanie dla tych, którzy uważają, że za pomocą $ rootscope wymaga zbyt dużo zamieszania: dodaj dziennik $ do kątowego obiektu.

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

Następnie podczas tworzenia kontrolerów nie jest wymagany dziennik $.

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

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

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

Możesz nawet posunąć się o krok dalej i dodać angular.info = $ log.info, jeśli chcesz go nieco skrócić.

Powiązane problemy