Angular JavaScriptコードをデバッグする方法


104

Angular JavaScriptを使用した概念実証に取り組んでいます。

別のブラウザー(FirefoxとChrome)でAngular JavaScriptコードをデバッグする方法は?


13
ええと、angularjsはテンプレートコードの多くをラップして動的に実行します...エラーのソースは常に "angular.js"なので、エラーのソースを見つけることはほとんど不可能です。
user3338098 2015

回答:


64

1. Chrome

デバッグAngularJSのためにクロムを使用できAngularJS Batarangを。(プラグインに関する最近のレビューから、AngularJS Batarangはもうメンテナンスされていないようです。さまざまなバージョンのChromeでテストされていません)

説明とデモのリンクは次のとおりです。

Angular JS Batarangの紹介

こちらからChromeプラグインをダウンロード:AngularJSをデバッグするためのChromeプラグイン

このリンクを参照することもできます:ng-book:Debugging AngularJS

ng-inspectを使用して角度をデバッグすることもできます。

2. Firefox

以下のためのFirefoxの助けを借りて、Firebugのあなたは、コードをデバッグすることができます。

このFirefoxアドオンも使用してください:AngScope:Firefoxのアドオン(AngularJSチームによる公式の拡張ではありません)

3. AngularJSのデバッグ:リンクの確認:AngularJSのデバッグ


1
残念ながら、それは実際には機能しません。私は彼がそれを素晴らしいアイデアであり、多くの可能性を秘めていることを維持することを望んでいます
Tules

5
@AskQuestion Batarangはサポートされなくなったようです。この回答は削除する必要があります
アーキルフェルナンデス2014

Angularチーム(主に@btford)は依然としてBatarangをサポートしていますが、次のAngularJS 2.0リリースでは全員が主導権を握っているので、Batarangはリストの優先事項ではないようです。ng-inspectバタランが頭痛の種を与えているかどうかを調べてください。
demisx 2014年

batarangが適切に機能していると仮定すると、コンソールのangular.jsエラーに追加のコンテキストは追加されず、「AngularJS」タブも役に立ちません。
user3338098 2015

1
@SazzadTusharKhan:わかりました。これを試してください-> Macバージョンでは、開発者メニュー(「開発」)があります。Macでは、このメニューは[設定]> [詳細設定]> [開発メニューを表示]で表示され、そこで「デバッグJavaScriptの開始」などの項目を表示できます。
ご参考までに

35

私見、最もイライラする経験は、視覚要素に関連する特定のスコープの値を取得/設定することから来ています。私は自分のコードだけでなく、angular.js自体にも多くのブレークポイントを設定しましたが、単にそれが最も効果的な方法ではない場合もあります。以下の方法は非常に強力ですが、実際に本番用コードで使用する場合は間違いなく悪い方法と見なされるため、賢く使用してください。

ビジュアル要素からコンソールで参照を取得する

IE以外の多くのブラウザでは、要素を右クリックして[要素の検査]をクリックすると、要素を選択できます。または、たとえば、Chromeの[要素]タブで任意の要素をクリックすることもできます。最後に選択された要素は$0、コンソールの変数に保存されます。

要素にリンクされたスコープを取得する

分離スコープを作成するディレクティブが存在するかどうかに応じて、angular.element($0).scope()またはangular.element($0).isolateScope()$($0).scope()$が有効な場合に使用)によってスコープを取得できます。これは、Batarangの最新バージョンを使用しているときに得られるものとまったく同じです。値を直接変更する場合は、を使用scope.$digest()して変更をUIに反映することを忘れないでください。

$ evalは悪です

必ずしもデバッグ用ではありません。scope.$eval(expression)式に期待値があるかどうかをすばやく確認したい場合に非常に便利です。

スコープの欠落したプロトタイプメンバー

違いscope.blascope.$eval('bla')、前者ではprototypically継承した値を考慮していません。以下のスニペットを使用して全体像を取得します(値を直接変更することはできませんが、$evalとにかく使用できます!)

scopeCopy = function (scope) {
    var a = {}; 
    for (x in scope){ 
        if (scope.hasOwnProperty(x) && 
            x.substring(0,1) !== '$' && 
            x !== 'this') {
            a[x] = angular.copy(scope[x])
        }
    }
    return a
};

scopeEval = function (scope) {
    if (scope.$parent === null) {
        return hoho(scope)
    } else {
        return angular.extend({}, haha(scope.$parent), hoho(scope))
    }
};

と一緒に使用してくださいscopeEval($($0).scope())

私のコントローラーはどこにありますか?

ngModelディレクティブを作成しているときに、値を監視したい場合があります。使用$($0).controller('ngModel')してあなたがチェックすることになる$formatters$parsers$modelValue$viewValue $render、すべてを。


13

使用できる$ logもあります!それはあなたがそれを動作させたい方法であなたのコンソールを利用します!

コンソールがあなたに通常示す方法でエラー/警告/情報を示します!

これを使用> ドキュメント


リンクが壊れています。
モニカの復活-notmaynard



7

残念ながら、ほとんどのアドオンとブラウザ拡張は値を表示しているだけですが、スコープ変数を編集したり、角度関数を実行したりすることはできません。ブラウザコンソール(すべてのブラウザ)で$ scope変数を変更する場合は、jqueryを使用できます。AngularJSの前にjQueryをロードすると、angular.elementにjQueryセレクターを渡すことができます。だからあなたはコントローラのスコープを調べることができます

angular.element('[ng-controller="name of your controller"]').scope()

例: $ scope変数の値を変更してブラウザで結果を確認し、ブラウザコンソールに入力するだけです。

angular.element('[ng-controller="mycontroller"]').scope().var1 = "New Value";
angular.element('[ng-controller="mycontroller"]').scope().$apply();

ブラウザーで変更をすぐに確認できます。$ apply()を使用した理由は、外部の角度のコンテキストから更新されたスコープ変数はバインディングを更新しないためですscope.$apply()。を使用してスコープの値を更新した後にダイジェストサイクルを実行する必要があります。

$ scope変数の値を監視するには、その変数を呼び出すだけです。

例: ChromeまたはFirefoxのWebコンソールで$ scope.var1の値を表示するには、次のように入力します。

angular.element('[ng-controller="mycontroller"]').scope().var1;

結果はすぐにコンソールに表示されます。


5

debugger使用する場所への呼び出しを追加します。

someFunction(){
  debugger;
}

ではconsole、ブラウザのWeb開発者向けツールのタブ、問題angular.reloadWithDebugInfo();

デバッグするページにアクセスするかリロードすると、ブラウザにデバッガが表示されます。


これは、何らかの理由でコンポーネントの内部では実際には機能しないようです。コンソールは、コンポーネントが作成されたポイントにブレークポイントを配置しているように見えますが、実際に実行されているコードを表示しません。少なくとも私にとっては。ただし、スコープである変数の値を表示できます。誰かがデバッガーにアドバイスをステップ実行されている実際のコードを表示させる方法を知っていれば幸いです。
user1023110

3
var rootEle = document.querySelector("html");
var ele = angular.element(rootEle); 

scope() 要素でscope()メソッドを使用して、要素(またはその親)から$ scopeをフェッチできます。

var scope = ele.scope();

インジェクター()

var injector = ele.injector();

このインジェクターを使用すると、サービス、その他のコントローラー、その他のオブジェクトなど、アプリ内のAngularオブジェクトをインスタンス化できます


ありがとう。ちょうど私が必要なもの!
marlar

2

コードに「デバッガ」を追加してアプリをリロードすると、そこにブレークポイントが設定され、「ステップオーバー」または実行できます。

var service = {
user_id: null,
getCurrentUser: function() {
  debugger; // Set the debugger inside 
            // this function
  return service.user_id;
}

2

開発者ツールに組み込まれたブラウザーを使用してデバッグできます。

  1. ブラウザで開発者ツールを開き、ソースタブに移動します。

  2. Ctrl + Pを使用してデバッグするファイルを開き、ファイル名を検索します

  3. コードの左側をクリックして行にブレークポイントを追加します。

  4. ページを更新。

クロムプラグインを使用するために参照できるデバッグ用のプラグインがたくさんあります。「デバッガークロム」プラグインを使用してAngularアプリケーションをデバッグします。


1

Visual Studioコード(Visual Studioではない)の場合 Ctrl+ Shift+ +P

検索バーに「Debugger for Chrome」と入力し、インストールして有効にします。

あなたのlaunch.jsonファイルにこの設定を追加してください:

{
    "version": "0.1.0",
    "configurations": [
        {
            "name": "Launch localhost with sourcemaps",
            "type": "chrome",
            "request": "launch",
            "url": "http://localhost/mypage.html",
            "webRoot": "${workspaceRoot}/app/files",
            "sourceMaps": true
        },
        {
            "name": "Launch index.html (without sourcemaps)",
            "type": "chrome",
            "request": "launch",
            "file": "${workspaceRoot}/index.html"
        },
    ]
}

拡張機能をChromeに接続するには、リモートデバッグを有効にしてChromeを起動する必要があります。

  • ウィンドウズ

Chromeショートカットを右クリックし、プロパティを選択します。「ターゲット」フィールドに--remote-debugging-port = 9222を追加するか、コマンドプロンプトで/chrome.exe --remote-debugging-port = 9222を実行します。

  • OS X

ターミナルで、/ Applications / Google \ Chrome.app/Contents/MacOS/Google \ Chrome --remote-debugging-port = 9222を実行します

  • Linux

ターミナルで、google-chrome --remote-debugging-port = 9222を起動します

もっと探す===>


0

アドオンが機能しなくなったため、JSにブレークポイントを設定してデータをそのように検査できるため、私が見つけた最も役立つツールセットはVisual Studio / IEを使用しています。もちろん、ChromeとFirefoxには一般的に優れた開発ツールがあります。また、良いol 'console.log()はとても役に立ちました!


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.