mirror of
https://github.com/Hopiu/angular.js.git
synced 2026-03-17 07:40:22 +00:00
we now have two types of namespaces: - true namespace: angular.* - used for all global apis - virtual namespace: ng.*, ngMock.*, ... - used for all DI modules the virual namespaces have services under the second namespace level (e.g. ng.) and filters and directives prefixed with filter: and directive: respectively (e.g. ng.filter:orderBy, ng.directive:ngRepeat) this simplifies urls and makes them a lot shorter while still avoiding name collisions
116 lines
2.9 KiB
JavaScript
116 lines
2.9 KiB
JavaScript
'use strict';
|
|
|
|
/**
|
|
* @ngdoc object
|
|
* @name ng.$log
|
|
* @requires $window
|
|
*
|
|
* @description
|
|
* Simple service for logging. Default implementation writes the message
|
|
* into the browser's console (if present).
|
|
*
|
|
* The main purpose of this service is to simplify debugging and troubleshooting.
|
|
*
|
|
* @example
|
|
<doc:example>
|
|
<doc:source>
|
|
<script>
|
|
function LogCtrl($log) {
|
|
this.$log = $log;
|
|
this.message = 'Hello World!';
|
|
}
|
|
</script>
|
|
<div ng-controller="LogCtrl">
|
|
<p>Reload this page with open console, enter text and hit the log button...</p>
|
|
Message:
|
|
<input type="text" ng-model="message"/>
|
|
<button ng-click="$log.log(message)">log</button>
|
|
<button ng-click="$log.warn(message)">warn</button>
|
|
<button ng-click="$log.info(message)">info</button>
|
|
<button ng-click="$log.error(message)">error</button>
|
|
</div>
|
|
</doc:source>
|
|
<doc:scenario>
|
|
</doc:scenario>
|
|
</doc:example>
|
|
*/
|
|
|
|
function $LogProvider(){
|
|
this.$get = ['$window', function($window){
|
|
return {
|
|
/**
|
|
* @ngdoc method
|
|
* @name ng.$log#log
|
|
* @methodOf ng.$log
|
|
*
|
|
* @description
|
|
* Write a log message
|
|
*/
|
|
log: consoleLog('log'),
|
|
|
|
/**
|
|
* @ngdoc method
|
|
* @name ng.$log#warn
|
|
* @methodOf ng.$log
|
|
*
|
|
* @description
|
|
* Write a warning message
|
|
*/
|
|
warn: consoleLog('warn'),
|
|
|
|
/**
|
|
* @ngdoc method
|
|
* @name ng.$log#info
|
|
* @methodOf ng.$log
|
|
*
|
|
* @description
|
|
* Write an information message
|
|
*/
|
|
info: consoleLog('info'),
|
|
|
|
/**
|
|
* @ngdoc method
|
|
* @name ng.$log#error
|
|
* @methodOf ng.$log
|
|
*
|
|
* @description
|
|
* Write an error message
|
|
*/
|
|
error: consoleLog('error')
|
|
};
|
|
|
|
function formatError(arg) {
|
|
if (arg instanceof Error) {
|
|
if (arg.stack) {
|
|
arg = (arg.message && arg.stack.indexOf(arg.message) === -1)
|
|
? 'Error: ' + arg.message + '\n' + arg.stack
|
|
: arg.stack;
|
|
} else if (arg.sourceURL) {
|
|
arg = arg.message + '\n' + arg.sourceURL + ':' + arg.line;
|
|
}
|
|
}
|
|
return arg;
|
|
}
|
|
|
|
function consoleLog(type) {
|
|
var console = $window.console || {},
|
|
logFn = console[type] || console.log || noop;
|
|
|
|
if (logFn.apply) {
|
|
return function() {
|
|
var args = [];
|
|
forEach(arguments, function(arg) {
|
|
args.push(formatError(arg));
|
|
});
|
|
return logFn.apply(console, args);
|
|
};
|
|
}
|
|
|
|
// we are IE which either doesn't have window.console => this is noop and we do nothing,
|
|
// or we are IE where console.log doesn't have apply so we log at least first 2 args
|
|
return function(arg1, arg2) {
|
|
logFn(arg1, arg2);
|
|
}
|
|
}
|
|
}];
|
|
}
|