วิธีการดีบัก Angular JavaScript Code


104

ฉันกำลังดำเนินการพิสูจน์แนวคิดโดยใช้ Angular JavaScript

จะแก้จุดบกพร่องของโค้ด JavaScript เชิงมุมในเบราว์เซอร์ต่างๆ (Firefox และ Chrome) ได้อย่างไร


13
uh angularjs รวมโค้ดเทมเพลตของคุณไว้เป็นจำนวนมากและเรียกใช้งานแบบไดนามิก ... ที่มาของข้อผิดพลาดคือ "angular.js" เสมอดังนั้นการค้นหาแหล่งที่มาของข้อผิดพลาดจึงแทบเป็นไปไม่ได้เลย
user3338098

คำตอบ:


64

1. Chrome

สำหรับ Debug AngularJS ในchromeคุณสามารถใช้AngularJS BatarangBatarang (จากรีวิวล่าสุดเกี่ยวกับปลั๊กอินดูเหมือนว่า AngularJS Batarang จะไม่ได้รับการดูแลอีกต่อไปการทดสอบใน Chrome เวอร์ชันต่างๆไม่ทำงาน)

นี่คือลิงค์สำหรับคำอธิบายและการสาธิต:

การแนะนำ Angular JS Batarang

ดาวน์โหลด chrome plugin จากที่นี่: chrome plugin สำหรับ debug AngularJS

คุณสามารถอ้างอิงลิงค์นี้: ng-book: Debugging AngularJS

คุณยังสามารถใช้ ng-Inspector สำหรับการดีบักเชิงมุม

2. Firefox

สำหรับFirefoxด้วยความช่วยเหลือของFirebugคุณสามารถดีบักโค้ดได้

ใช้ส่วนเสริมของ Firefox ด้วย: AngScope: Add-ons สำหรับ Firefox (ไม่ใช่ส่วนขยายอย่างเป็นทางการโดย AngularJS Team)

3. การดีบัก AngularJS : ตรวจสอบลิงก์: การดีบัก AngularJS


1
ความอัปยศมันไม่ได้ผลจริงๆ ฉันหวังว่าผู้ชายคนนั้นจะเริ่มรักษาสิ่งนี้ไว้เพราะมันเป็นความคิดที่ดีและมีศักยภาพมาก
Tules

5
@AskQuestion ดูเหมือนว่า Batarang จะไม่ได้รับการสนับสนุนอีกต่อไป คำตอบนี้ควรถูกลบออก
Aakil Fernandes

ทีม Angular (ส่วนใหญ่เป็น @btford) ยังคงสนับสนุน Batarang แต่ดูเหมือนจะไม่ได้รับความสำคัญในรายการของพวกเขาเนื่องจากพวกเขาทั้งหมดเป็นหัวหน้าใน AngularJS 2.0 รุ่นถัดไป ดูng-inspectว่า Batarang ทำให้คุณปวดหัวหรือไม่
demisx

สมมติว่า batarang ทำงานได้อย่างถูกต้องไม่มีการเพิ่มบริบทเพิ่มเติมให้กับข้อผิดพลาด angular.js ในคอนโซลและแท็บ 'AngularJS' ก็ไม่ช่วยเช่นกัน
user3338098

1
@SazzadTusharKhan: โอเค ลองใช้ -> ในเวอร์ชัน mac ที่คุณมีเมนูนักพัฒนา ("พัฒนา") ที่ mac เมนูนี้จะแสดงผ่านการตั้งค่า> ขั้นสูง> แสดงเมนูการพัฒนาและคุณสามารถดูรายการต่างๆเช่น "เริ่มการดีบักจาวาสคริปต์" สำหรับข้อมูลอ้างอิง: youtube.com/watch?v=BUvsnDhFL2w
Vaibhav Jain

35

IMHO ประสบการณ์ที่น่าผิดหวังที่สุดมาจากการรับ / กำหนดค่าขอบเขตเฉพาะที่เกี่ยวข้องกับองค์ประกอบภาพ ฉันทำเบรกพอยต์จำนวนมากไม่เพียง แต่ในโค้ดของฉันเองเท่านั้น แต่ยังรวมถึง angular.js ด้วย แต่บางครั้งมันก็ไม่ใช่วิธีที่มีประสิทธิภาพมากที่สุด แม้ว่าวิธีการด้านล่างจะมีประสิทธิภาพมาก แต่ก็ถือว่าเป็นการปฏิบัติที่ไม่ดีอย่างแน่นอนหากคุณใช้ในรหัสการผลิตจริง ๆ ดังนั้นจงใช้อย่างชาญฉลาด!

รับการอ้างอิงในคอนโซลจากองค์ประกอบภาพ

ในเบราว์เซอร์ที่ไม่ใช่ IE จำนวนมากคุณสามารถเลือกองค์ประกอบได้โดยคลิกขวาที่องค์ประกอบแล้วคลิก "ตรวจสอบองค์ประกอบ" หรือคุณสามารถคลิกที่องค์ประกอบใดก็ได้ในแท็บองค์ประกอบใน Chrome เช่น องค์ประกอบที่เลือกล่าสุดจะถูกเก็บไว้ในตัวแปร$0ในคอนโซล

รับขอบเขตที่เชื่อมโยงกับองค์ประกอบ

ขึ้นอยู่กับว่ามีคำสั่งที่สร้างขอบเขตแยกคุณสามารถดึงขอบเขตโดยangular.element($0).scope()หรือangular.element($0).isolateScope()(ใช้$($0).scope()ถ้าเปิดใช้งาน $) นี่คือสิ่งที่คุณจะได้รับเมื่อคุณใช้ Batarang เวอร์ชันล่าสุด หากคุณกำลังเปลี่ยนค่าโดยตรงอย่าลืมใช้scope.$digest()เพื่อแสดงการเปลี่ยนแปลงบน UI

$ eval นั้นชั่วร้าย

ไม่จำเป็นสำหรับการดีบัก scope.$eval(expression)มีประโยชน์มากเมื่อคุณต้องการตรวจสอบอย่างรวดเร็วว่านิพจน์มีค่าที่คาดไว้หรือไม่

สมาชิกต้นแบบของขอบเขตที่หายไป

ความแตกต่างระหว่างscope.blaและscope.$eval('bla')เป็นอดีตไม่ได้พิจารณาถึงคุณค่าที่สืบทอดมาจากต้นแบบ ใช้ตัวอย่างด้านล่างเพื่อรับภาพรวม (คุณไม่สามารถเปลี่ยนค่าได้โดยตรง แต่คุณสามารถใช้ได้$evalต่อไป!)

scopeCopy = function (scope) {
    var a = {}; 
    for (x in scope){ 
        if (scope.hasOwnProperty(x) && 
            x.substring(0,1) !== '$' && 
            x !== 'this') {
            a[x] = angular.copy(scope[x])
        }
    }
    return a
};

scopeEval = function (scope) {
    if (scope.$parent === null) {
        return hoho(scope)
    } else {
        return angular.extend({}, haha(scope.$parent), hoho(scope))
    }
};

ใช้กับscopeEval($($0).scope()).

คอนโทรลเลอร์ของฉันอยู่ที่ไหน

บางครั้งคุณอาจต้องการตรวจสอบค่าngModelเมื่อคุณเขียนคำสั่ง ใช้$($0).controller('ngModel')และคุณจะได้รับการตรวจสอบ$formatters, $parsers, $modelValue, $viewValue $renderและทุกอย่าง


13

นอกจากนี้ยังมี $ log ที่คุณสามารถใช้ได้! ใช้ประโยชน์จากคอนโซลของคุณในแบบที่คุณต้องการให้ทำงาน!

แสดงข้อผิดพลาด / คำเตือน / ข้อมูลตามที่คอนโซลของคุณแสดงตามปกติ!

ใช้สิ่งนี้> เอกสาร



10

แม้จะมีการตอบคำถาม แต่ก็น่าสนใจที่จะดูng-inspector


ฉันไม่พบว่า AngularJS Batarang มีประโยชน์ แต่ ng-inspector ดูเหมือนจะทำงานได้ดี
Martin Vseticka


7

น่าเสียดายที่ส่วนเสริมและส่วนขยายเบราว์เซอร์ส่วนใหญ่แสดงค่าให้คุณเห็น แต่ไม่อนุญาตให้คุณแก้ไขตัวแปรขอบเขตหรือเรียกใช้ฟังก์ชันเชิงมุม หากคุณต้องการเปลี่ยนตัวแปร $ ขอบเขตในคอนโซลเบราว์เซอร์ (ในทุกเบราว์เซอร์) คุณสามารถใช้ jquery หากคุณโหลด jQuery ก่อน AngularJS คุณสามารถส่ง angular.element ตัวเลือก jQuery ได้ ดังนั้นคุณสามารถตรวจสอบขอบเขตของคอนโทรลเลอร์ด้วยไฟล์

angular.element('[ng-controller="name of your controller"]').scope()

ตัวอย่าง: คุณต้องเปลี่ยนค่าของตัวแปร $ ขอบเขตและดูผลลัพธ์ในเบราว์เซอร์จากนั้นพิมพ์ในคอนโซลของเบราว์เซอร์:

angular.element('[ng-controller="mycontroller"]').scope().var1 = "New Value";
angular.element('[ng-controller="mycontroller"]').scope().$apply();

คุณสามารถเห็นการเปลี่ยนแปลงในเบราว์เซอร์ของคุณได้ทันที เหตุผลที่เราใช้ $ apply () คือ: ตัวแปรขอบเขตใด ๆ ที่อัปเดตจากบริบทเชิงมุมภายนอกจะไม่อัปเดตการเชื่อมโยงคุณต้องเรียกใช้วงจรการย่อยหลังจากอัปเดตค่าขอบเขตโดยใช้scope.$apply()ปรับปรุงจากบริบทเชิงมุมนอกจะไม่ปรับปรุงมันผูกพันคุณจำเป็นต้องใช้ย่อยรอบหลังจากการปรับปรุงค่าขอบเขตการใช้

สำหรับการสังเกตค่าตัวแปร $ ขอบเขตคุณเพียงแค่เรียกตัวแปรนั้น

ตัวอย่าง: คุณต้องการเห็นค่า $ scope.var1 ในเว็บคอนโซลใน Chrome หรือ Firefox เพียงพิมพ์:

angular.element('[ng-controller="mycontroller"]').scope().var1;

ผลลัพธ์จะแสดงในคอนโซลทันที


5

เพิ่มการโทรไปยังdebuggerตำแหน่งที่คุณต้องการใช้

someFunction(){
  debugger;
}

ใน consoleแท็บของเครื่องมือสำหรับนักพัฒนาเว็บเบราว์เซอร์ของคุณปัญหาangular.reloadWithDebugInfo();

ไปที่หรือโหลดหน้าที่คุณต้องการแก้ไขข้อบกพร่องซ้ำและดูตัวแก้ไขข้อบกพร่องปรากฏในเบราว์เซอร์ของคุณ


สิ่งนี้ดูเหมือนจะไม่ทำงานในส่วนประกอบด้วยเหตุผลบางประการ คอนโซลดูเหมือนจะค้นหาจุดพัก ณ จุดที่สร้างคอมโพเนนต์ แต่จะไม่แสดงโค้ดที่กำลังเรียกใช้งานจริง อย่างน้อยก็ไม่ใช่สำหรับฉัน แม้ว่าคุณจะสามารถดูค่าของตัวแปรที่เป็นขอบเขตได้ หากใครรู้วิธีรับดีบักเกอร์เพื่อแสดงรหัสจริงที่กำลังดำเนินการผ่านคำแนะนำจะได้รับการชื่นชม
user1023110

3
var rootEle = document.querySelector("html");
var ele = angular.element(rootEle); 

ขอบเขต () เราสามารถดึง $ ขอบเขตจากองค์ประกอบ (หรือพาเรนต์) โดยใช้วิธีการขอบเขต () บนองค์ประกอบ:

var scope = ele.scope();

หัวฉีด ()

var injector = ele.injector();

ด้วยหัวฉีดนี้เราสามารถสร้างอินสแตนซ์วัตถุ Angular ใด ๆ ภายในแอพของเราได้เช่นบริการตัวควบคุมอื่น ๆ หรือวัตถุอื่น ๆ


ขอบคุณ. สิ่งที่ฉันต้องการ!
marlar

2

คุณสามารถเพิ่ม 'ดีบักเกอร์' ในโค้ดของคุณและโหลดแอพซ้ำซึ่งจะทำให้เบรกพอยต์อยู่ตรงนั้นและคุณสามารถ 'ก้าวข้าม' หรือเรียกใช้

var service = {
user_id: null,
getCurrentUser: function() {
  debugger; // Set the debugger inside 
            // this function
  return service.user_id;
}

2

คุณสามารถแก้ไขข้อบกพร่องโดยใช้เบราว์เซอร์ที่สร้างขึ้นในเครื่องมือสำหรับนักพัฒนา

  1. เปิดเครื่องมือสำหรับนักพัฒนาในเบราว์เซอร์และไปที่แท็บแหล่งที่มา

  2. เปิดไฟล์ที่คุณต้องการแก้จุดบกพร่องโดยใช้ Ctrl + P และค้นหาชื่อไฟล์

  3. เพิ่มจุดพักในบรรทัด ny คลิกที่ด้านซ้ายของรหัส

  4. รีเฟรชหน้า

มีปลั๊กอินมากมายสำหรับการดีบักที่คุณสามารถอ้างถึงการใช้ปลั๊กอิน Chrome Debug Angular Application โดยใช้ปลั๊กอิน"Debugger for chrome"


1

สำหรับ Visual Studio Code (ไม่ใช่ Visual Studio) ให้ทำ Ctrl+ Shift+P

พิมพ์ Debugger for Chrome ในแถบค้นหาติดตั้งและเปิดใช้งาน

ในlaunch.jsonไฟล์ของคุณให้เพิ่มการกำหนดค่านี้:

{
    "version": "0.1.0",
    "configurations": [
        {
            "name": "Launch localhost with sourcemaps",
            "type": "chrome",
            "request": "launch",
            "url": "http://localhost/mypage.html",
            "webRoot": "${workspaceRoot}/app/files",
            "sourceMaps": true
        },
        {
            "name": "Launch index.html (without sourcemaps)",
            "type": "chrome",
            "request": "launch",
            "file": "${workspaceRoot}/index.html"
        },
    ]
}

คุณต้องเปิด Chrome โดยเปิดใช้งานการดีบักระยะไกลเพื่อให้ส่วนขยายแนบกับมัน

  • Windows

คลิกขวาที่ทางลัดของ Chrome และเลือกคุณสมบัติในช่อง "เป้าหมาย" ต่อท้าย --remote-debugging-port = 9222 หรือในพรอมต์คำสั่งเรียกใช้ /chrome.exe --remote-debugging-port = 9222

  • OS X

ในเทอร์มินัลรัน / Applications / Google \ Chrome.app/Contents/MacOS/Google \ Chrome --remote-debugging-port = 9222

  • ลินุกซ์

ในเทอร์มินัลให้เปิด google-chrome --remote-debugging-port = 9222

ค้นหาเพิ่มเติม ===>


0

เนื่องจากส่วนเสริมไม่ทำงานอีกต่อไปชุดเครื่องมือที่มีประโยชน์ที่สุดที่ฉันพบคือใช้ Visual Studio / IE เพราะคุณสามารถตั้งค่าเบรกพอยต์ใน JS ของคุณและตรวจสอบข้อมูลของคุณด้วยวิธีนั้น แน่นอน Chrome และ Firefox มีเครื่องมือ dev ที่ดีกว่าโดยทั่วไป นอกจากนี้ console.log () ที่ดียังมีประโยชน์มาก!


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.