$scope
ChromeのJavaScriptコンソールで変数にアクセスしたいと思います。それ、どうやったら出来るの?
コンソール$scope
にモジュールの名前も変数として表示されません。myapp
$scope
ChromeのJavaScriptコンソールで変数にアクセスしたいと思います。それ、どうやったら出来るの?
コンソール$scope
にモジュールの名前も変数として表示されません。myapp
開発者ツールのHTMLパネルで要素を選択し、コンソールに次のように入力します。
angular.element($0).scope()
WebKitとFirefoxでは、は$0
要素タブで選択されたDOMノードへの参照であるため、これを行うことにより、選択されたDOMノードスコープがコンソールに出力されます。
次のように、要素IDでスコープをターゲットにすることもできます。
angular.element(document.getElementById('yourElementId')).scope()
アドオン/拡張機能
あなたがチェックしたいと思うかもしれないいくつかの非常に便利なChrome拡張機能があります:
バタラン。これはしばらく前からあります。
ng-インスペクター。これは最新のものであり、その名前が示すように、アプリケーションのスコープを検査することができます。
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/
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で述べたように)は、[要素]タブでそれをクリックすることで、自動的にとして保存され$0
ます。
angular.element($0).scope();
Batarangをインストールした場合
次に、次のように書くことができます。
$scope
クロムの要素ビューで要素を選択した場合。参照-https ://github.com/angular/angularjs-batarang#console
これは、バタランなしでスコープを取得する方法です。次のことができます。
var scope = angular.element('#selectorId').scope();
または、コントローラー名でスコープを検索する場合は、次のようにします。
var scope = angular.element('[ng-controller=myController]').scope();
モデルに変更を加えたら、次のコマンドを呼び出して、変更をDOMに適用する必要があります。
scope.$apply();
コントローラのどこかに(多くの場合、最後の行が適切な場所です)、
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()関数を定義していますが、それは問題ありません...子/内部/暗黙のスコープはその関数にアクセスでき、イベントに基づいてスコープを出力します。したがって、に関連付けられているスコープが出力されます。イベントを発生させた要素。
@ jm-の提案も機能しますが、jsFiddle内では機能しないと思います。Chrome内のjsFiddleで次のエラーが発生します:
> angular.element($0).scope()
ReferenceError: angular is not defined
これらの回答の多くに対する1つの注意点:コントローラーにエイリアスを設定すると、スコープオブジェクトはから返されたオブジェクト内のオブジェクトに含まれscope()
ます。
たとえば、コントローラーディレクティブが次のように作成されている場合:
コントローラーのプロパティ<div ng-controller="FormController as frm">
にアクセスするには、次のように呼び出します。startDate
angular.element($0).scope().frm.startDate
他の回答を追加および拡張するには、コンソールで、Enterキー$($0)
を押して要素を取得します。Angularjsアプリケーションの場合、jQueryliteバージョンがデフォルトでロードされます。
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()
オブジェクトを選択した後のBatarangが最適であることに同意し$scope
ます(jQueryと同じangular.element($0).scope()
かそれよりも短い:($($0).scope()
私のお気に入り))
また、私のようにbody
要素のメインスコープを持っている場合は、正常に$('body').scope()
機能します。
$scope
グローバル変数として割り当てるだけです。問題が解決しました。
app.controller('myCtrl', ['$scope', '$http', function($scope, $http) {
window.$scope = $scope;
}
実際に$scope
は、本番よりも開発の方が頻繁に必要になります。
@JasonGoemaatによってすでに言及されていますが、この質問への適切な回答として追加しています。
要素を調べて、コンソールでこれを使用します
s = $($0).scope()
// `s` is the scope object if it exists
私はangular.element($(".ng-scope")).scope();
過去に使用したことがあり、それは素晴らしい働きをします。ページにアプリスコープが1つしかない場合、または次のようなことができる場合にのみ有効です。
angular.element($("div[ng-controller=controllerName]")).scope();
またangular.element(document.getElementsByClassName("ng-scope")).scope();
私は通常、そのためにjQuery data()関数を使用します。
$($0).data().$scope
$ 0は、現在chromeDOMInspectorで選択されているアイテムです。$ 1、$2..などは以前に選択されたアイテムです。
最初に、検査するスコープ内にあるDOMから要素を選択できます。
次に、コンソールで次のクエリを実行して、スコープオブジェクトを表示できます。
angular.element($0).scope()
スコープの任意のプロパティをクエリできます。例:
angular.element($0).scope().widgets
または、スコープに接続されているコントローラーを検査できます。
angular.element($0).scope().$myControllerName
(機能する別のオプションは、コードにブレークポイントを設定することです。$scope
が現在の「プレーンオールドJavaScript」スコープにある場合は$scope
、コンソールでの値を調べることができます。)
次のような要素のスコープにアクセスしたいとします。
<div ng-controller="hw"></div>
コンソールで次を使用できます。
angular.element(document.querySelector('[ng-controller=hw]')).scope();
これにより、その要素のスコープが得られます。
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
これには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;
}
角度では、angular.element()....によってjquery要素を取得します。
angular.element().scope();
例:
<div id=""></div>
スコープ外でJavaScript変数を定義し、それをコントローラーのスコープに割り当てるだけです。
var myScope;
...
app.controller('myController', function ($scope,log) {
myScope = $scope;
...
それでおしまい!すべてのブラウザで動作するはずです(少なくともChromeとMozillaでテスト済み)。
それは機能していて、私はこの方法を使用しています。