AngularJSを使用してブラウザーのコンソールで$ scope変数にアクセスするにはどうすればよいですか?


1239

$scopeChromeのJavaScriptコンソールで変数にアクセスしたいと思います。それ、どうやったら出来るの?

コンソールで$scopeモジュールの名前をmyapp変数として表示することも、表示することもできません。


85
デバッグでは、通常、window.MY_SCOPE = $scope;最初にコントローラー機能を設定します。
Jason Goemaat 2013年

6
Firefoxでの開発/テストを検討している場合は、選択したDOM要素のオブジェクトをFirebugのDOMインスペクターに表示する小さな拡張機能であるAngScopeを使用することもできます$scope
Kos Prov 2014年

@JasonGoemaat window。$ scope = $ scope;を使用しない理由 MY_SCOPEではなく$ scopeを使用するだけでよいように-私は問題に気づいていませんが、セキュリティ上の懸念や何かが足りない可能性があります。
James Gentes

8
わかりやすくするために、angularを初めて使用するユーザーは混乱して、$ scopeがそのように使用されているのを見ただけでコンソールで魔法のように使用できると思っているかもしれません。また、ディレクティブ宣言でスコープを誤って使用したり、コード内で$ scopeを使用したりすると、エラーが発生する代わりにウィンドウオブジェクトでスコープが使用されます。
Jason Goemaat

回答:


1759

開発者ツールのHTMLパネルで要素を選択し、これをコンソールに入力します。

angular.element($0).scope()

WebKitとFirefox、$0そうこれを行うことにより、あなたはコンソールでプリントアウト選択したDOMノードのスコープを取得し、要素]タブで選択されたDOMノードへの参照です。

次のように、要素IDでスコープをターゲットにすることもできます。

angular.element(document.getElementById('yourElementId')).scope()

アドオン/拡張

あなたがチェックしたいかもしれないいくつかの非常に便利なChrome拡張機能があります:

  • Batarang。これはしばらく前からあります。

  • ng-inspector。これは最新のものであり、名前が示すように、アプリケーションのスコープを検査できます。

jsFiddleで遊ぶ

jsfiddleを使用する場合、URLの最後にを追加することにより、表示モードでフィドルを開くことができ/showます。このように実行すると、angularグローバルにアクセスできます。ここで試すことができます:

http://jsfiddle.net/jaimem/Yatbt/show

jQuery Lite

AngularJSの前にjQueryをロードangular.elementすると、jQueryセレクターを渡すことができます。だからあなたはコントローラのスコープを調べることができます

angular.element('[ng-controller=ctrl]').scope()

ボタンの

 angular.element('button:eq(1)').scope()

... 等々。

あなたは実際にそれを簡単にするためにグローバル関数を使いたいかもしれません:

window.SC = function(selector){
    return angular.element(selector).scope();
};

今、これを行うことができます

SC('button:eq(10)')
SC('button:eq(10)').row   // -> value of scope.row

ここをチェックしてください:http//jsfiddle.net/jaimem/DvRaR/1/show/


ありがとう。Batarangをインストールしようとすると、お使いのコンピュータがサポートされていないことがわかります。ubuntuがあります。
murtaza52

@ jm-以降、angular.element($0).scope()いくつかのメソッドを呼び出そうとするまで機能します。私は試しましたが、何らかの理由でこの設定ではHTTPリクエストが可能ではありませんか?
krtek 2013

41
デバッグ情報を無効にする場合は、このメソッドを使用すると常に未定義になることに注意してください。これは意図されており、$ compileProvider上のデバッグ情報を無効にしない、.well ...することによって防止することができる
Robba

6
angular.element($ 0).scope()の代替:$($ 0).scope()を実行することもできます
user2954463

1
@jaimeは、パフォーマンスのためにオフにされたときに、要素からのスコープの取得を再度有効にする方法について言及する必要があります。
enorl76

187

jmの答えを改善するには...

// Access whole scope
angular.element(myDomElement).scope();

// Access and change variable in scope
angular.element(myDomElement).scope().myVar = 5;
angular.element(myDomElement).scope().myArray.push(newItem);

// Update page to reflect changed variables
angular.element(myDomElement).scope().$apply();

または、jQueryを使用している場合、これは同じことを行います...

$('#elementId').scope();
$('#elementId').scope().$apply();

コンソールからDOM要素にアクセスするもう1つの簡単な方法(jmで述べたように)は、「要素」タブでDOM要素をクリックすると、自動的にとして保存され$0ます。

angular.element($0).scope();

3
(それが正しいかどう)あなたはいつも後で構文を使用することができるように、角度は、jqueryののサブセットが含まれている、私は確かにそれはないよ
Pizzaiolaゴルゴンゾーラ

3
で終わりましたangular.element(document.body).scope()、ありがとう!
Alex Sorokoletov 2016年


37

これは、バタランなしでスコープを取得する方法です。次のことができます。

var scope = angular.element('#selectorId').scope();

または、コントローラー名でスコープを検索する場合は、次のようにします。

var scope = angular.element('[ng-controller=myController]').scope();

モデルに変更を加えたら、次を呼び出して変更をDOMに適用する必要があります。

scope.$apply();

4
この回答にはどのように多くの賛成票がありますか?これにはjQueryは必要ありません。angular.elementはすでに要素選択メソッドです。IDで要素を選択する
キョーティック2015年

3
必要だとは言わなかった。私が言っているのは、すでにそこにある場合は、このように使用できるということです。
BraveNewMath 2015年

4
angular.element あなたはすでにjQueryを使用しています。実際、jQueryが使用可能な場合angular.elementは、jQueryのエイリアスです。あなたはコードを不必要に複雑にしています。angular.element('#selectorId')そして、angular.element('[ng-controller=myController]')だけ少ないコードで、同じことを行います。あなたも電話をかけるかもしれませんangular.element('#selectorId'.toString())
Kyeotic

8
@ティルシウス、おそらくあなたのフィードバックは非難的で怒りが少なく、もう少し専門的でしょうか?
Tass

6
@Tassあなたは正しいです、私は不必要に失礼でした。謝罪します。同じことが2回行われていると言えば十分です。
キョーティック

31

コントローラのどこかに(多くの場合、最後の行が適切な場所です)、

console.log($scope);

ng-repeatの内部など、内部/暗黙のスコープを表示したい場合は、このようなものが機能します。

<li ng-repeat="item in items">
   ...
   <a ng-click="showScope($event)">show scope</a>
</li>

次に、コントローラで

function MyCtrl($scope) {
    ...
    $scope.showScope = function(e) {
        console.log(angular.element(e.srcElement).scope());
    }
}

上記では親スコープでshowScope()関数を定義していますが、問題ありません... child / inner / implicitスコープはその関数にアクセスでき、イベントに基づいてスコープを出力します。イベントを発生させた要素

@ jm-の提案も機能しますが、jsFiddle内では機能しないと思います。Chrome内のjsFiddleでこのエラーが発生します。

> angular.element($0).scope()
ReferenceError: angular is not defined


10

これらの答えの多くに対する1つの警告:コントローラにエイリアスを付ける場合、スコープオブジェクトはから返されたオブジェクト内のオブジェクトになりますscope()

たとえば、コントローラーディレクティブが次のように作成されている場合、コントローラー <div ng-controller="FormController as frm">startDateプロパティにアクセスするには、次のように呼び出します。angular.element($0).scope().frm.startDate


コントローラ$scope$ctrlを使用して名前を変更するかどうかに関係controllerAsなく、デフォルトで名前が付けられたのプロパティとして(したがってコンソールに)表示するためにアクセスできます。既存の回答で「警告」がどこにあったかわかりません。ここでの回答のほとんどは、controllerAs一般的な方法ではなかったときに返されたものです。
tao

正しい。それらの答えが出されたときcontrollerAs、それは一般的な習慣ではなかったので、コントローラにエイリアスを付けるように指示しているが、エイリアスを使用しないとプロパティを表示しない「クックブック」をフォローしている初心者には混乱しました。物事は2年前に速く動いていました。
マイケルブラックバーン

8

私は$scope、オブジェクトを選択した後のバタランが最善であることに同意します(angular.element($0).scope()jQuery と同じか、それよりも短いです:($($0).scope()私のお気に入り))

また、私のようにbody要素の主なスコープを持っている場合、問題なく$('body').scope()動作します。


7

他の回答を追加して拡張するには、コンソールでと入力$($0)して要素を取得します。Angularjsアプリケーションの場合、jQuery liteバージョンがデフォルトでロードされます。

jQueryを使用していない場合は、次のようにangular.element($ 0)を使用できます。

angular.element($0).scope()

jQueryとバージョンがあるかどうかを確認するには、コンソールで次のコマンドを実行します。

$.fn.jquery

要素を検査した場合、現在選択されている要素はコマンドラインAPIリファレンス$ 0を介して利用できます。FirebugとChromeの両方にこの参照があります。

ただし、Chrome開発者ツールは、これらの参照を使用して、$ 0、$ 1、$ 2、$ 3、$ 4という名前のプロパティを通じて選択された最後の5つの要素(またはヒープオブジェクト)を利用できるようにします。最後に選択した要素またはオブジェクトは$ 0として、2番目に選択した要素またはオブジェクトは$ 1として参照できます。

以下は、FirebugのコマンドラインAPIリファレンスで、そのリファレンスを一覧表示しています。

$($0).scope()要素に関連付けられたスコープを返します。あなたはすぐにそのプロパティを見ることができます。

あなたが使用できる他のいくつかのものは:

  • 要素の親スコープを表示します。

$($0).scope().$parent

  • これもチェーンできます:

$($0).scope().$parent.$parent

  • ルートスコープを確認できます。

$($0).scope().$root

  • 分離スコープでディレクティブを強調表示した場合は、次のように表示できます。

$($0).isolateScope()

詳細と例については、見慣れないAngularjsコードをデバッグするためのヒントとコツを参照してください。


5

要素を検査し、コンソールでこれを使用します

s = $($0).scope()
// `s` is the scope object if it exists

5

$scopeグローバル変数として割り当てるだけです。問題が解決しました。

app.controller('myCtrl', ['$scope', '$http', function($scope, $http) {
    window.$scope = $scope;
}

実際に$scopeは、プロダクションよりも開発のほうが必要です。

@JasonGoemaatですでに言及されていますが、この質問への適切な回答として追加しています。


4

私はangular.element($(".ng-scope")).scope();過去に使用したことがあり、それは素晴らしい働きをします。ページにアプリスコープが1つしかない場合、または次のようなことができる場合にのみ有効です。

angular.element($("div[ng-controller=controllerName]")).scope(); または angular.element(document.getElementsByClassName("ng-scope")).scope();


3

私は通常そのためにjQuery data()関数を使用します:

$($0).data().$scope

$ 0はChrome DOMインスペクターで現在選択されているアイテムです。$ 1、$ 2 ..などは以前に選択されたアイテムです。


2

次のように要素のスコープにアクセスしたいとします

<div ng-controller="hw"></div>

コンソールでは以下を使用できます。

angular.element(document.querySelector('[ng-controller=hw]')).scope();

これにより、その要素のスコープが得られます。


1
ここでは、「document.querySelector」必要はありません
ステパンスヴォーロフ

1

Chromeのコンソールで:

 1. Select the **Elements** tab
 2. Select the element of your angular's scope. For instance, click on an element <ui-view>, or <div>, or etc.
 3. Type the command **angular.element($0).scope()** with following variable in the angular's scope

angular.element($0).scope().a
angular.element($0).scope().b

Chromeのコンソール ここに画像の説明を入力してください


1

これにはjQueryもインストールする必要がありますが、開発環境では完全に機能します。各要素を調べてスコープのインスタンスを取得し、コントローラー名のラベルが付いたスコープを返します。プロパティの削除も$で始まります。これは、angularjsが一般的に構成に使用するものです。

let controllers = (extensive = false) => {
            let result = {};
            $('*').each((i, e) => {
                let scope = angular.element(e).scope();
                if(Object.prototype.toString.call(scope) === '[object Object]' && e.hasAttribute('ng-controller')) {
                    let slimScope = {};
                    for(let key in scope) {
                        if(key.indexOf('$') !== 0 && key !== 'constructor' || extensive) {
                            slimScope[key] = scope[key];
                        }
                    }
                    result[$(e).attr('ng-controller')] = slimScope;
                }
            });

            return result;
        }

0

angularでは、angular.element()....によってjquery要素を取得します...

angular.element().scope();

例:

<div id=""></div>


0

デバッグ目的でのみ、これをコントローラーの先頭に配置しました。

   window.scope = $scope;

  $scope.today = new Date();

そして、これが私がそれを使う方法です。

ここに画像の説明を入力してください

デバッグが完了したら削除します。


-1

コードに$ scope変数への参照に近い場所にブレークポイントを配置します($ scopeが現在の「プレーンな古いJavaScript」スコープにあるようにします)。次に、コンソールで$ scope値を検査できます。


-6

スコープ外のJavaScript変数を定義し、それをコントローラーのスコープに割り当てるだけです。

var myScope;
...
app.controller('myController', function ($scope,log) {
     myScope = $scope;
     ...

それでおしまい!すべてのブラウザーで動作するはずです(少なくともChromeとMozillaでテスト済み)。

それは機能しており、私はこの方法を使用しています。


2
グローバル変数を使用することは悪い習慣ですが、ほとんどの場合これで大丈夫だと思います。結局のところ、これはデバッグ専用です。ただし、同じ変数名を2回使用しないように注意する必要があります。
Pedro Affonso、2015

3
ソースコードを変更する必要があるため、これは悪い考えです。これはあなた自身のコードであっても迷惑であり、別のサーバーで実行されているものでは不可能です。コードを変更できる場合でも、元に戻すことを忘れないでください。ですから、うまくいくかもしれませんが、それはベストプラクティスではありません。
ジムデイビス

1
@JimDavis一般に同意しますが、これを行うと便利な場合があります。ソースを一時的に変更することで、手動で何度も行う必要があることをコードに実行させることができます。そのため、問題が厄介で、デバッグに時間がかかる場合は、コードを変更します。変更を元に戻すのは、適切なツール(git)を使用すると簡単です。
maaartinus
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.