ฉันต้องการเข้าถึง$scope
ตัวแปรของฉันในคอนโซล JavaScript ของ Chrome ฉันจะทำอย่างไร
ฉันไม่สามารถมองเห็น$scope
หรือชื่อของโมดูลmyapp
ในคอนโซลเป็นตัวแปร
ฉันต้องการเข้าถึง$scope
ตัวแปรของฉันในคอนโซล JavaScript ของ Chrome ฉันจะทำอย่างไร
ฉันไม่สามารถมองเห็น$scope
หรือชื่อของโมดูลmyapp
ในคอนโซลเป็นตัวแปร
คำตอบ:
เลือกองค์ประกอบในแผง HTML ของเครื่องมือสำหรับนักพัฒนาและพิมพ์ในคอนโซล:
angular.element($0).scope()
ในWebKitและ Firefox$0
เป็นการอ้างอิงถึงโหนด DOM ที่เลือกในแท็บองค์ประกอบดังนั้นเมื่อทำสิ่งนี้คุณจะได้รับขอบเขต DOM โหนดที่เลือกที่พิมพ์ออกมาในคอนโซล
นอกจากนี้คุณยังสามารถกำหนดเป้าหมายขอบเขตตามรหัสองค์ประกอบเช่น:
angular.element(document.getElementById('yourElementId')).scope()
addons / ส่วนขยาย
มีส่วนขยาย Chrome ที่มีประโยชน์มากซึ่งคุณอาจต้องการดู:
เล่นกับ jsFiddle
เมื่อทำงานกับ jsfiddle คุณสามารถเปิดซอในโหมดแสดงโดยเพิ่ม/show
ที่ส่วนท้ายของ URL เมื่อทำงานเช่นนี้คุณจะสามารถเข้าถึงangular
ทั่วโลก คุณสามารถลองได้ที่นี่:
http://jsfiddle.net/jaimem/Yatbt/show
jQuery Lite
หากคุณโหลด jQuery ก่อน AngularJS 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/
angular.element($0).scope()
ใช้งานได้จนกว่าคุณจะพยายามโทรหาวิธีการบางอย่าง ฉันลองแล้วและด้วยเหตุผลบางอย่างที่ไม่มีการร้องขอ HTTP เป็นไปได้ในการตั้งค่านี้
เพื่อปรับปรุงคำตอบของ 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) คือการคลิกที่มันอยู่ในแท็บ 'องค์ประกอบ' $0
และมันจะได้รับการจัดเก็บไว้เป็น
angular.element($0).scope();
angular.element(document.body).scope()
ขอบคุณ!
หากคุณติดตั้งBatarang
จากนั้นคุณสามารถเขียน:
$scope
เมื่อคุณมีองค์ประกอบที่เลือกในมุมมององค์ประกอบในโครเมี่ยม Ref - https://github.com/angular/angularjs-batarang#console
นี่เป็นวิธีหนึ่งในการเข้าถึงขอบเขตโดยไม่มี Batarang คุณสามารถทำได้:
var scope = angular.element('#selectorId').scope();
หรือถ้าคุณต้องการค้นหาขอบเขตของคุณตามชื่อคอนโทรลเลอร์ให้ทำดังนี้
var scope = angular.element('[ng-controller=myController]').scope();
หลังจากที่คุณทำการเปลี่ยนแปลงโมเดลของคุณคุณจะต้องใช้การเปลี่ยนแปลงกับ DOM โดยโทร:
scope.$apply();
angular.element
เป็นวิธีการเลือกองค์ประกอบแล้ว หยุดบอกว่าคุณต้องการ jQuery สำหรับงานง่าย ๆ เช่นเลือกองค์ประกอบตาม id!
angular.element
สิ่งที่คุณใช้อยู่แล้ว jQuery สำหรับ ในความเป็นจริงถ้า jQuery พร้อมใช้งานangular.element
เป็นนามแฝงสำหรับ jQuery คุณไม่มีความซับซ้อนในรหัสของคุณ angular.element('#selectorId')
และangular.element('[ng-controller=myController]')
ทำสิ่งเดียวกันโดยมีรหัสน้อยกว่า คุณอาจจะเรียกangular.element('#selectorId'.toString())
อยู่ที่ไหนสักแห่งในตัวควบคุมของคุณ (มักจะเป็นบรรทัดสุดท้ายเป็นสถานที่ที่ดี) ใส่
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-also ก็ใช้งานได้เช่นกันแต่ฉันไม่คิดว่ามันจะทำงานได้ใน jsFiddle ฉันได้รับข้อผิดพลาดนี้ใน jsFiddle ภายใน Chrome:
> angular.element($0).scope()
ReferenceError: angular is not defined
หนึ่งข้อแม้หลายคำตอบเหล่านี้: scope()
ถ้าคุณนามแฝงควบคุมของคุณวัตถุขอบเขตของคุณจะอยู่ในวัตถุภายในวัตถุกลับมาจาก
ตัวอย่างเช่นหากคำสั่งควบคุมของคุณถูกสร้างขึ้นเช่น
<div ng-controller="FormController as frm">
นั้นแล้วเพื่อเข้าถึงstartDate
คุณสมบัติของตัวควบคุมของคุณคุณจะโทรangular.element($0).scope().frm.startDate
$scope
ชื่อ$ctrl
โดยค่าเริ่มต้นเป็นอิสระจากว่าคุณเปลี่ยนชื่อโดยใช้controllerAs
หรือไม่ ฉันไม่เข้าใจที่คุณเห็น"ข้อแม้"ในคำตอบที่มีอยู่ โปรดทราบคำตอบส่วนใหญ่ที่นี่ได้รับการตอบกลับเมื่อcontrollerAs
ไม่ใช่การปฏิบัติทั่วไป
controllerAs
ไม่ใช่การปฏิบัติทั่วไปมันจึงสับสนสำหรับมือใหม่ที่อาจทำตาม "ตำรา" ที่บอกให้พวกเขาควบคุมนามแฝง แต่ก็ไม่เห็นคุณสมบัติโดยไม่ใช้นามแฝง หลายสิ่งเคลื่อนไหวอย่างรวดเร็วเมื่อสองปีก่อน
ฉันยอมรับสิ่งที่ดีที่สุดคือ Batarang ด้วย$scope
หลังจากเลือกวัตถุ (เหมือนกับangular.element($0).scope()
jQuery: $($0).scope()
(หรือที่ชื่นชอบ))
นอกจากนี้ถ้าชอบฉันคุณมีขอบเขตหลักในbody
องค์ประกอบการ$('body').scope()
ทำงานที่ดี
ในการเพิ่มและปรับปรุงคำตอบอื่น ๆ ในคอนโซลให้ป้อน$($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 โดยใช้การอ้างอิงเหล่านี้ องค์ประกอบหรือวัตถุที่เลือกล่าสุดสามารถอ้างอิงได้เป็น $ 0 ซึ่งล่าสุดเป็นอันดับที่สองเป็น $ 1 และอื่น ๆ
นี่คือการอ้างอิง Command Line API สำหรับ Firebugที่แสดงรายการการอ้างอิง
$($0).scope()
จะส่งคืนขอบเขตที่เกี่ยวข้องกับองค์ประกอบ คุณสามารถดูคุณสมบัติได้ทันที
สิ่งอื่น ๆ ที่คุณสามารถใช้ได้คือ:
$($0).scope().$parent
.
$($0).scope().$parent.$parent
$($0).scope().$root
$($0).isolateScope()
ดูเคล็ดลับและเทคนิคสำหรับการดีบักโค้ด Angularjs ที่ไม่คุ้นเคยสำหรับรายละเอียดและตัวอย่างเพิ่มเติม
ตรวจสอบองค์ประกอบแล้วใช้สิ่งนี้ในคอนโซล
s = $($0).scope()
// `s` is the scope object if it exists
เพียงกำหนดให้$scope
เป็นตัวแปรทั่วโลก แก้ไขปัญหา.
app.controller('myCtrl', ['$scope', '$http', function($scope, $http) {
window.$scope = $scope;
}
เราต้องการ$scope
การพัฒนาบ่อยกว่าการผลิต
พูดถึงแล้วโดย @JasonGoemaat แต่เพิ่มเป็นคำตอบที่เหมาะสมสำหรับคำถามนี้
ฉันเคยใช้angular.element($(".ng-scope")).scope();
ในอดีตและใช้งานได้ดี ใช้ได้ดีถ้าคุณมีขอบเขตแอปเพียงหนึ่งขอบเขตบนหน้าเว็บหรือคุณสามารถทำสิ่งต่อไปนี้
angular.element($("div[ng-controller=controllerName]")).scope();
หรือ angular.element(document.getElementsByClassName("ng-scope")).scope();
ฉันมักจะใช้ฟังก์ชั่น jQuery data () เพื่อ:
$($0).data().$scope
ขณะนี้รายการ $ 0 ถูกเลือกในตัวตรวจสอบ DOM ของ chrome $ 1, $ 2 .. และอื่น ๆ เป็นรายการที่เลือกไว้ก่อนหน้านี้
สมมติว่าคุณต้องการเข้าถึงขอบเขตขององค์ประกอบเช่น
<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 ที่จะติดตั้งเช่นกัน แต่ทำงานได้อย่างสมบูรณ์แบบสำหรับสภาพแวดล้อม dev มันจะตรวจสอบแต่ละองค์ประกอบเพื่อรับอินสแตนซ์ของขอบเขตจากนั้นส่งคืนพวกเขาที่มีเลเบลด้วยชื่อตัวควบคุม มันยังเอาคุณสมบัติเริ่มต้นด้วย $ ซึ่งเป็นสิ่งที่ 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;
}
ในเชิงมุมเราได้รับองค์ประกอบ jquery โดย angular.element () .... ช่วยให้ c ...
angular.element().scope();
ตัวอย่าง:
<div id=""></div>
สำหรับจุดประสงค์ในการดีบั๊กฉันใส่สิ่งนี้ไว้ที่จุดเริ่มต้นของคอนโทรลเลอร์
window.scope = $scope;
$scope.today = new Date();
และนี่คือวิธีที่ฉันใช้
จากนั้นลบเมื่อเสร็จสิ้นการดีบัก
วางเบรกพอยต์ในรหัสของคุณที่ใดที่หนึ่งใกล้กับการอ้างอิงถึงตัวแปร $ scope (เพื่อให้ $ scope อยู่ในขอบเขต 'ธรรมดาเก่า JavaScript') จากนั้นคุณสามารถตรวจสอบค่า $ scope ในคอนโซล
เพียงกำหนดตัวแปร JavaScript ที่อยู่นอกขอบเขตและกำหนดให้กับขอบเขตในคอนโทรลเลอร์ของคุณ:
var myScope;
...
app.controller('myController', function ($scope,log) {
myScope = $scope;
...
แค่นั้นแหละ! ควรทำงานกับเบราว์เซอร์ทั้งหมด (ทดสอบอย่างน้อยใน Chrome และ Mozilla)
มันใช้งานได้และฉันใช้วิธีนี้
window.MY_SCOPE = $scope;
สิ่งแรกในฟังก์ชั่นควบคุมของฉัน