2014-04-09 2 views
6

क्या प्रत्येक सेवा और नियंत्रक में AngularJS के $ लॉग को इंजेक्ट करने का कोई तरीका है? यह सिर्फ हर किसी के लिए निर्दिष्ट थोड़ा अनावश्यक लगता है।

उत्तर

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) के रूप में सेट करने के लिए होगा, लेकिन मैं ऐसा नहीं होता।

+0

जब आप वैश्विक क्षेत्र में 'var $ log' को परिभाषित करते हैं तो आप मूल रूप से' विंडो 'सेट कर रहे हैं। $ Log' –

2

एक और तरीका यह है कि आप रूटस्कोप में एक विधि जोड़ना चाहते हैं, और उसके बाद इसे $ स्कोप के माध्यम से एक्सेस करें। अपने नियंत्रकों में $ रूट, इस प्रकार एक और इंजेक्शन से परहेज करें। मुझे नहीं पता कि यह ग्लोबल्स जितना बुरा है।

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

काफी अच्छा। मैं अपने नियंत्रक को 'नियंत्रक के रूप में' सिंटैक्स का उपयोग करके सब कुछ डालने के बिना लिखना चाहता हूं, इसलिए यह पता चला कि मुझे उन सभी में $ स्कोप इंजेक्ट करने की आवश्यकता होगी और केवल $ लॉग इंजेक्ट करना आसान है। –

+1

शायद ही अपग्रेड की तरह दिखता है - मैं '$ scope। $ Root.log' टाइप करने के बजाय हर जगह '$ log' इंजेक्ट करना चाहता हूं, जबकि उन जगहों पर' $ scope' इंजेक्शन भी दे रहा था, उदाहरण के लिए: उदाहरण के लिए: स्कोप निर्देश अलग करना) ... मैं सफल हो जाऊंगा –

0

यहाँ जो लोग सोचते हैं कि $ rootscope का उपयोग कर बहुत ज्यादा उपद्रव की आवश्यकता के लिए एक समाधान है: $ लॉग जोड़ने कोणीय वस्तु के लिए।

angular.module('myModule') 
    .run(['$log', function($log) { 
     angular.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 जोड़ सकते हैं यदि आप इसे और छोटा करना चाहते हैं।

संबंधित मुद्दे

 संबंधित मुद्दे