AngularJS kullanarak tarayıcı konsolundaki $ scope değişkenine nasıl erişirim?


1239

$scopeDeğişkenime Chrome'un JavaScript konsolundan erişmek istiyorum . Bunu nasıl yaparım?

Modülümün $scopeadını myappkonsolda ne değişken olarak ne de görebiliyorum .


85
Hata ayıklama için genellikle window.MY_SCOPE = $scope;denetleyici işlevimde ilk şeyi ayarladım .
Jason Goemaat

6
Firefox'ta geliştirme / test yapmayı düşünüyorsanız , $scopeseçilen DOM öğelerinin nesnelerini Firebug'un DOM Denetçisine gösteren küçük bir uzantı olan AngScope'u da kullanabilirsiniz .
Kos Prov

@JasonGoemaat neden pencere kullanmıyorsunuz. $ Scope = $ scope; böylece sadece MY_SCOPE yerine $ kapsam kullanabilirsiniz - Ben herhangi bir sorun fark etmedim ama belki bir güvenlik kaygısı falan eksik.
James Gentes

8
Sadece netlik için, açısal yeni biri karışabilir ve eğer sadece bu şekilde kullanıldığını gördüyse $ scope'un konsolda sihirli bir şekilde kullanılabilir olduğunu düşünebilir. Ayrıca, örneğin kodda yanlışlıkla bir yönerge bildiriminde ve $ kapsamda yanlışlıkla kullanırsanız, hata almak yerine bunu pencere nesnesinde kullanırsınız.
Jason Goemaat

Yanıtlar:


1759

Geliştirici araçlarının HTML panelinde bir öğe seçin ve bunu konsola yazın:

angular.element($0).scope()

In WebKit ve Firefox, $0böylece bunu yaparak konsolda çıktısı seçilen DOM düğüm kapsamını olsun, elementler sekmesinde seçilen DOM düğüme referanstır.

Kapsamı şu şekilde öğe kimliğine göre de hedefleyebilirsiniz:

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

Eklentileri / Uzantıları

Kontrol etmek isteyebileceğiniz bazı yararlı Chrome uzantıları vardır:

  • Batarang . Bu bir süredir var.

  • ng-müfettiş . Bu en yenisidir ve adından da anlaşılacağı gibi, uygulamanızın kapsamlarını incelemenize izin verir.

JsFiddle ile oynamak

Jsfiddle ile çalışırken URL'nin sonuna ekleyerek kemanı gösteri modunda açabilirsiniz /show. Bu şekilde koşarken angularküresel olana erişebilirsiniz . Burada deneyebilirsiniz:

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

jQuery Lite

AngularJS'den önce jQuery yüklerseniz, angular.elementbir jQuery seçicisinden geçirilebilir. Böylece bir kontrol cihazının kapsamını

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

Bir düğmenin

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

... ve bunun gibi.

Aslında bunu kolaylaştırmak için küresel bir işlev kullanmak isteyebilirsiniz:

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

Şimdi bunu yapabilirsin

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

Buradan kontrol edin: http://jsfiddle.net/jaimem/DvRaR/1/show/


Teşekkürler. Batarang'ı yüklemeye çalıştığımda bana bilgisayarınızın desteklenmediğini söylüyor, ubuntu var, herhangi bir fikir var mı?
murtaza52

@ jm- olarak, angular.element($0).scope()bazı yöntemleri çağırmaya çalışana kadar çalışır. Denedim ve herhangi bir nedenle bu kurulumda HTTP istekleri mümkün değil mi?
krtek

41
Hata ayıklama bilgilerini devre dışı bırakıyorsanız, bu yöntemi kullanarak her zaman tanımsız kalacağınızı unutmayın. Bu amaçlanmıştır ve $ compileProvider üzerinde hata ayıklama bilgilerini devre dışı bırakmadığını, .well .. önlenebilir
Robba

6
angular.element (0 $) .scope () alternatifi: ayrıca $ (0 $) .scope ()
user2954463

1
@jaime, performans için kapatıldığında bir öğeden kapsam almayı nasıl yeniden etkinleştireceğinizi belirtmelidir.
enorl76

187

JM'nin cevabını geliştirmek için ...

// 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();

Veya jQuery kullanıyorsanız, bu aynı şeyi yapar ...

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

Konsoldan bir DOM öğesine erişmenin başka bir kolay yolu (jm belirtildiği gibi) 'öğeler' sekmesinde tıklamaktır ve otomatik olarak olarak depolanır $0.

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

3
açısal bir jquery alt kümesi içerir, bu yüzden her zaman sonraki sözdizimini kullanabilirsiniz (doğru ise), emin değilim
Pizzaiola Gorgonzola

3
Sonunda angular.element(document.body).scope()teşekkür ederim!
Alex Sorokoletov


37

Bu, Batarang olmadan kapsama girmenin bir yoludur, şunları yapabilirsiniz:

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

Veya kapsamınızı denetleyici adına göre bulmak istiyorsanız, bunu yapın:

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

Modelinizde değişiklik yaptıktan sonra, değişiklikleri arayarak DOM'a uygulamanız gerekir:

scope.$apply();

4
Bu cevapta nasıl bu kadar çok oy var? Bunun için jQuery gerekmez! angular.elementzaten bir öğe seçim yöntemidir. Bir öğeyi kimliğiyle seçmek
Kyeotic

3
İhtiyacın olduğunu söylemedim. Söylediğim zaten orada varsa, bu şekilde kullanabilirsiniz.
BraveNewMath

4
angular.element zaten jQuery için kullandığınız şey yapıyor. Aslında, jQuery varsa, jQuery angular.elementiçin bir takma addır. Kodunuzu gereksiz yere karmaşık hale getiriyorsunuz. angular.element('#selectorId')ve angular.element('[ng-controller=myController]')aynı şeyi sadece daha az kodla yapın. Siz de arayabilirsinizangular.element('#selectorId'.toString())
Kyeotic

8
@Tyrsius, belki geri bildirimleriniz daha az suçlayıcı ve öfkeli ve biraz daha profesyonel olabilir mi?
Tass

6
@Tass Haklısın, gereksiz yere kaba davrandım. Özür dilerim. Aynı şeyin iki kez yapıldığını söylemek yeterlidir.
Kyeotic

31

Denetleyicinizde bir yerde (genellikle son satır iyi bir yerdir)

console.log($scope);

Bir iç / örtülü kapsam görmek istiyorsanız, bir ng-yinede söyleyin, böyle bir şey işe yarayacaktır.

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

Sonra kumandanızda

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

Yukarıda showScope () işlevini üst kapsamda tanımladığımızı, ancak sorun değil ... alt / iç / örtük kapsamın bu işleve erişebileceğini ve daha sonra olaya dayalı kapsamı ve dolayısıyla olayı başlatan öğe.

@ jm- 'nin önerisi de işe yarıyor, ama bir jsFiddle içinde çalıştığını düşünmüyorum. Chrome'da jsFiddle'da bu hatayı alıyorum:

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


10

Bu cevapların çoğuna bir uyarı: kontrolörünüzü taklit ederseniz, kapsam nesneleriniz döndürülen nesnenin içindeki bir nesnede olacaktır scope().

Örneğin, denetleyici yönergeniz şöyle oluşturulursa: denetleyicinizin <div ng-controller="FormController as frm"> bir startDateözelliğine erişmek için ,angular.element($0).scope().frm.startDate


Denetleyiciye , varsayılan olarak $scopeadlandırılmış bir özelliği olarak $ctrlkullanarak controllerAsveya adını değiştirip değiştirmediğinizden bağımsız olarak görüntülenebilir (dolayısıyla konsolda) . Mevcut cevaplarda nerede bir "uyarı" gördüğünüzü anlamıyorum . Buradaki cevapların çoğunun controllerAsyaygın bir uygulama olmadığında geri verildiğine dikkat edin .
tao

Sağ. Bu cevaplar verildiğinde, controllerAsyaygın bir uygulama değildi, bu yüzden denetleyiciyi takma adlarına söyleyen ancak daha sonra takma ad kullanmadan özellikleri görmeyen bir "yemek kitabını" takip eden yeni başlayanlar için kafa karıştırıcıydı. İki yıl önce işler hızla ilerliyordu.
Michael Blackburn

8

En iyisi, $scopebir nesneyi seçtikten sonra Batarang ile katılıyorum ( angular.element($0).scope()jQuery ile aynı veya daha kısa: $($0).scope()(benim favorim))

Ayrıca, benim gibi bodyöğenin ana kapsamına sahipseniz , $('body').scope()iyi çalışır.


7

Diğer yanıtları eklemek ve geliştirmek için, konsolda $($0)öğeyi almak üzere girin . Bir Angularjs uygulamasıysa, varsayılan olarak bir jQuery lite sürümü yüklenir.

JQuery kullanmıyorsanız, aşağıdaki gibi angular.element (0 $) kullanabilirsiniz:

angular.element($0).scope()

JQuery ve sürümünün olup olmadığını kontrol etmek için konsolda şu komutu çalıştırın:

$.fn.jquery

Bir öğeyi incelediyseniz, seçili öğeye $ 0 komut satırı API başvurusu aracılığıyla erişilebilir. Hem Firebug hem de Chrome bu referansa sahiptir.

Bununla birlikte, Chrome geliştirici araçları, bu referansları kullanarak $ 0, $ 1, $ 2, $ 3, $ 4 adlı özelliklerle seçilen son beş öğeyi (veya yığın nesnelerini) kullanılabilir hale getirecektir. En son seçilen öğeye veya nesneye $ 0, ikincisine en son $ 1 vb. Başvurulabilir.

İşte Firebug için referanslarını listeleyen Komut Satırı API referansı.

$($0).scope()öğeyle ilişkili kapsamı döndürür. Özelliklerini hemen görebilirsiniz.

Kullanabileceğiniz diğer bazı şeyler şunlardır:

  • Öğelerin üst kapsamını görüntüleme:

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

  • Bunu da zincirleyebilirsiniz:

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

  • Kök kapsamına bakabilirsiniz:

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

  • İzole kapsamı olan bir yönerge vurguladıysanız, aşağıdakilere bakabilirsiniz:

$($0).isolateScope()

Daha fazla ayrıntı ve örnek için Bilmediğiniz Angularjs Kodunda Hata Ayıklama İpuçları ve Püf Noktaları konusuna bakın .


5

Elemanı inceleyin, ardından bunu konsolda kullanın

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

5

$scopeGlobal değişken olarak atamanız yeterlidir. Sorun çözüldü.

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

Aslında $scopegelişimde üretimden daha sık ihtiyacımız var .

@JasonGoemaat tarafından zaten bahsedildi, ancak bu soruya uygun bir cevap olarak eklendi.


4

angular.element($(".ng-scope")).scope();Geçmişte kullandım ve harika çalışıyor. Yalnızca sayfada yalnızca bir uygulama kapsamınız varsa veya şunun gibi bir şey yapabilirsiniz:

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


3

Genellikle bunun için jQuery data () işlevini kullanın:

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

$ 0 şu anda krom DOM denetçisinde seçilen öğedir. 1 $, 2 $ .. vb. Önceden seçilmiş öğelerdir.


2

Diyelim ki elemanın kapsamına erişmek istediğiniz

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

Konsolda aşağıdakileri kullanabilirsiniz:

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

Bu size o öğenin kapsamını verecektir.


1
burada "document.querySelector" la ihtiyacımız yok
Stepan Suvorov

1

Chrome konsolunda:

 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

Misal

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

Chrome konsolu resim açıklamasını buraya girin


1

Bu, jQuery'nin de yüklenmesini gerektirir, ancak geliştirici ortamı için mükemmel çalışır. Kapsamların örneklerini almak için her öğeye bakar ve daha sonra bunları denetleyici adlarıyla etiketlenmiş olarak döndürür. Ayrıca herhangi bir özelliği kaldırmak, angularjs'in yapılandırması için genellikle kullandığı $ ile başlar.

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

açısal olarak biz angular.element () .... tarafından jquery öğesi olsun ...

angular.element().scope();

misal:

<div id=""></div>


0

Yalnızca hata ayıklama amacıyla, bunu denetleyicinin başına koydum.

   window.scope = $scope;

  $scope.today = new Date();

Ve ben böyle kullanıyorum.

resim açıklamasını buraya girin

sonra hata ayıklama bittiğinde silin.


-1

Kodunuza $ scope değişkeni referansına yakın bir yere bir kesme noktası koyun (böylece $ kapsamı geçerli 'düz eski JavaScript' kapsamında olur). Ardından konsoldaki $ scope değerini inceleyebilirsiniz.


-6

Kapsam dışında bir JavaScript değişkeni tanımlamanız ve denetleyicinizdeki kapsamınıza atamanız yeterlidir:

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

Bu kadar! Tüm tarayıcılarda çalışmalıdır (en azından Chrome ve Mozilla'da test edilmiştir).

Çalışıyor ve bu yöntemi kullanıyorum.


2
Global değişkenleri kullanmak kötü bir uygulamadır, ancak sanırım bu çoğu durumda iyidir. Sonuçta sadece hata ayıklama için; Ancak yine de aynı değişken adını iki kez kullanmamaya dikkat etmelisiniz.
Pedro Affonso

3
Kötü bir fikir çünkü kaynak kodunu değiştirmenizi gerektiriyor. Bu, kendi kodunuz olsa bile sinir bozucu ve başka bir sunucuda çalışan bir şeyse imkansız. Kodu değiştirebilseniz bile, geri almayı unutmamalısınız. Bu yüzden işe yarayabilir olsa da, en iyi uygulama değildir.
Jim Davis

1
@JimDavis Genel olarak katılıyorum, ancak bunu yaparken bazı durumlar var: Kaynakları geçici olarak değiştirerek, kodun tekrar tekrar yapmanız gereken şeyleri manuel olarak yapmasına izin verebilirsiniz. Bu yüzden sorun zorlaştığında ve hata ayıklama uzun sürdüğünde, kodu değiştiririm. Değişiklikleri geri almak doğru araçla (git) önemsizdir.
maaartinus
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.