1

Ich habe Logger-Service geschrieben, aber ich habe einen Fehler, den ich nicht verstehen konnte.Ich habe meinen eigenen Logger in angular2

ist hier ein Teil des Codes:

import { Injectable } from "@angular/core"; 
@Injectable() 
export class LoggerService { 
    private _log: Function; 

    constructor() { 
     this._log = console.log; 

     this.blockDefaultConsoleMethods(); 
    } 

    public log(...args) { 
     this._log(args); 
    } 

    private blockDefaultConsoleMethods() { 
     console.log = console.info = console.warn = console.error =() => null; 
    } 
} 

ist ein Fehler: TypeError: Illegal invocation

Die Hauptidee ist Standardkonsole Methoden

+0

wo erscheint der Fehler im Code? – toskv

+0

@toskv, wenn ich eine Methode aufrufen – Illorian

+0

welche Codezeile in Ihrem Beispiel? – toskv

Antwort

2

Aufrufen console.log wie dies nicht direkt deprecate Arbeit. Sie könnten versuchen, und es wie folgt aufrufen:

import { Injectable } from "@angular/core"; 
@Injectable() 
export class LoggerService { 
    private _log: Function; 

    constructor() { 
     this._log = console.log; 

     this.blockDefaultConsoleMethods(); 
    } 

    public log(...args) { 
     Function.prototype.apply.call(this._log, console, args); // <--- change here 
    } 

    private blockDefaultConsoleMethods() { 
     console.log = console.info = console.warn = console.error =() => null; 
    } 
} 

Working Plunker for example usage

+0

Ja, es funktioniert. Können Sie verstehen, warum?) – Illorian

+1

Das Konsolenobjekt wird nicht angezeigt, bis die Entwicklerwerkzeuge zum ersten Mal für eine bestimmte Registerkarte geöffnet werden. Und außerdem erwartet das 'console.log' ein' this' Objekt darin, um auf Mitglieder seines Objekts zuzugreifen, die Sie nicht haben, wenn Sie es direkt aufrufen, wie Sie es getan haben. Deshalb müssen Sie einen Kontext hinzufügen, wie Sie es mit 'Function.prototype.apply.call' machen können (siehe das Argument' console'). – rinukkusu

+0

Es ist großartig, danke! – Illorian