AngularJS를 사용하여 브라우저 콘솔에서 $ scope 변수에 어떻게 액세스합니까?


1239

$scopeChrome의 JavaScript 콘솔에서 변수에 액세스하고 싶습니다 . 어떻게합니까?

콘솔에서 $scope모듈 이름을 myapp변수로 볼 수 없습니다 .


85
디버깅을 위해 일반적으로 window.MY_SCOPE = $scope;컨트롤러 기능에서 가장 먼저 설정했습니다 .
Jason Goemaat 1

6
Firefox에서 개발 / 테스트를 고려중인 경우 선택한 DOM 요소의 객체를 Firebug의 DOM 검사기로 표시하는 작은 확장 인 AngScope 를 사용할 수도 있습니다 $scope.
Kos Prov

@JasonGoemaat 왜 window. $ scope = $ scope를 사용하지 않는가; 그래서 당신은 단순히 MY_SCOPE 대신 $ scope를 사용할 수 있습니다-나는 아무런 문제도 눈치 채지 못했지만 보안 문제 나 다른 것을 놓치고 있습니다.
James Gentes

8
명확성을 기하기 위해, 앵귤러를 처음 접하는 사람은 혼란스러워서 콘솔에서 $ scope를 마술처럼 사용할 수 있다고 생각할 수 있습니다. 또한 지시문 선언에서 범위를 실수로 사용하고 예를 들어 코드에서 $ scope를 사용하면 오류 대신 창 개체에서 범위를 사용하게됩니다.
Jason Goemaat 2016 년

답변:


1759

개발자 도구의 HTML 패널에서 요소를 선택하고 콘솔에이를 입력하십시오.

angular.element($0).scope()

에서 웹킷 과 파이어 폭스, $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 라이트

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을 설치하려고 할 때 컴퓨터가 지원되지 않는다고 알려줍니다. 우분투, 어떤 아이디어가 있습니까?
murtaza52

@ jm- 현재 angular.element($0).scope()일부 메소드를 호출 할 때까지 작동합니다. 시도했지만 어떤 이유로 든이 설정에서 HTTP 요청이 불가능합니까?
krtek

41
디버그 정보를 비활성화하면이 방법을 사용하여 항상 정의되지 않습니다. 이것은 $ compileProvider에서 디버그 정보를 비활성화하지 않는 것입니다. .well .: .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 요소에 액세스하는 또 다른 쉬운 방법은 jm 언급 한대로 'elements'탭에서 해당 요소를 클릭하면 자동으로로 저장됩니다 $0.

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

3
angular에는 jquery의 하위 집합이 포함되어 있으므로 나중에 올바른 구문을 사용할 수 있습니다 (정확한 경우). 확실하지 않습니다
Pizzaiola Gorgonzola

3
나는 결국 angular.element(document.body).scope(), 감사합니다!
Alex Sorokoletov


37

이것은 Batarang없이 범위를 얻는 방법입니다.

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

또는 컨트롤러 이름으로 범위를 찾으려면 다음을 수행하십시오.

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

모델을 변경 한 후 다음을 호출하여 변경 사항을 DOM에 적용해야합니다.

scope.$apply();

4
이 답변에는 많은 투표가 어떻게 있습니까? 이를 위해 jQuery가 필요하지 않습니다! angular.element이미 요소 선택 방법입니다. id로 요소를 선택하는
Kyeotic

3
나는 당신이 필요하다고 말하지 않았습니다. 내가 말하는 것은 이미 거기에 있다면 이것처럼 사용할 수 있다는 것입니다.
BraveNewMath

4
angular.element 이미 jQuery를 사용하고 있습니다. 실제로 jQuery가 사용 가능한 경우 jQuery angular.element별명입니다. 코드를 불필요하게 복잡하게 만들고 있습니다. angular.element('#selectorId')그리고 angular.element('[ng-controller=myController]')오직 적은 코드와 같은 일을한다. 당신은 또한 전화 할 수도 있습니다angular.element('#selectorId'.toString())
Kyeotic

8
@Tyrsius, 아마도 귀하의 의견이 덜 비난 받고 화를 내고 좀 더 전문적 일 수 있습니까?
Tass

6
@Tass 당신 말이 맞아요, 불필요하게 무례했습니다. 죄송합니다. 동일한 일이 두 번 수행되고 있다고 말하는 것으로 충분합니다.
Kyeotic

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 () 함수를 정의하지만 괜찮습니다 ... 자식 / 내부 / 암시 적 범위는 해당 함수에 액세스 할 수 있으며 이벤트를 기반으로 범위를 인쇄하므로 이벤트를 발생시킨 요소

@ jm-의 제안도 효과가 있지만 jsFiddle 내에서 작동한다고 생각하지 않습니다. Chrome의 jsFiddle 에서이 오류가 발생합니다.

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


10

이러한 답변 중 하나에 대한주의 사항 : 컨트롤러의 별칭을 지정하면 스코프 객체는 반환 된 객체 내의 객체에 있습니다. scope() .

예를 들어 컨트롤러 지시어가 <div ng-controller="FormController as frm"> 다음 과 같이 생성되면 컨트롤러 의 startDate속성에 액세스 하려면angular.element($0).scope().frm.startDate


컨트롤러 사용자가 이름을 바꾸 었는지 여부에 관계없이 기본적으로 $scope이름이 지정된 의 속성으로 볼 수 있으므로 콘솔에 액세스 할 수 있습니다 . 기존 답변에서 "캐비티" 를 본 위치를 이해하지 못합니다 . 여기에있는 대부분의 답변 은 일반적인 관행이 아닌 경우 에 제공 되었습니다. $ctrlcontrollerAscontrollerAs
tao

권리. 이 답변을 받았을 때 controllerAs일반적인 관행은 아니기 때문에 컨트롤러의 별칭을 지정했지만 별칭을 사용하지 않고 속성을 보지 못하는 "요리 책"을 따르는 초보자에게는 혼란 스러웠습니다. 2 년 전에 상황이 빠르게 움직이고있었습니다.
Michael Blackburn

8

$scope객체를 선택한 후 Batarang이 가장 좋습니다 ( 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, 두 번째는 $ 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();과거에 사용해 왔으며 훌륭하게 작동합니다. 페이지에 앱 범위가 하나만 있거나 다음과 같은 작업을 수행 할 수있는 경우에만 적합합니다.

angular.element($("div[ng-controller=controllerName]")).scope(); 또는 angular.element(document.getElementsByClassName("ng-scope")).scope();


3

나는 일반적으로 jQuery data () 함수를 사용합니다.

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

크롬 DOM 검사기에서 $ 0이 현재 선택되어 있습니다. $ 1, $ 2 등은 이전에 선택한 항목입니다.


2

다음과 같은 요소의 범위에 액세스하고 싶다고 가정 해보십시오.

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

콘솔에서 다음을 사용할 수 있습니다.

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

그러면 해당 요소의 범위가 제공됩니다.


1
"document.querySelector"가 필요하지 않습니다
Stepan Suvorov

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

크롬 콘솔 여기에 이미지 설명을 입력하십시오


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.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
전역 변수를 사용하는 것은 나쁜 습관이지만 대부분의 경우 괜찮습니다. 결국 디버깅 전용입니다. 그러나 여전히 동일한 변수 이름을 두 번 사용하지 않도록주의해야합니다.
Pedro Affonso

3
소스 코드를 수정해야하므로 나쁜 생각입니다. 이것은 자신의 코드 인 경우에도 성가 시며 다른 서버에서 실행중인 경우 불가능합니다. 코드를 수정할 수 있더라도 실행 취소해야합니다. 따라서 작동하지만 최선의 방법은 아닙니다.
Jim Davis

1
@JimDavis 일반적으로 동의하지만, 이렇게하면 유용합니다. 소스를 임시로 수정하면 코드를 수동으로 반복해서 다시 수행해야하는 작업을 수행 할 수 있습니다. 문제가 까다 롭고 디버깅 시간이 오래 걸리면 코드를 수정합니다. 올바른 도구 (git)를 사용하면 변경 내용을 취소 할 수 있습니다.
maaartinus
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.