ฉันกำลังดำเนินการพิสูจน์แนวคิดโดยใช้ Angular JavaScript
จะแก้จุดบกพร่องของโค้ด JavaScript เชิงมุมในเบราว์เซอร์ต่างๆ (Firefox และ Chrome) ได้อย่างไร
ฉันกำลังดำเนินการพิสูจน์แนวคิดโดยใช้ Angular JavaScript
จะแก้จุดบกพร่องของโค้ด JavaScript เชิงมุมในเบราว์เซอร์ต่างๆ (Firefox และ Chrome) ได้อย่างไร
คำตอบ:
1. Chrome
สำหรับ Debug AngularJS ในchromeคุณสามารถใช้AngularJS BatarangBatarang (จากรีวิวล่าสุดเกี่ยวกับปลั๊กอินดูเหมือนว่า AngularJS Batarang จะไม่ได้รับการดูแลอีกต่อไปการทดสอบใน Chrome เวอร์ชันต่างๆไม่ทำงาน)
นี่คือลิงค์สำหรับคำอธิบายและการสาธิต:
ดาวน์โหลด 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
ng-inspect
ว่า Batarang ทำให้คุณปวดหัวหรือไม่
IMHO ประสบการณ์ที่น่าผิดหวังที่สุดมาจากการรับ / กำหนดค่าขอบเขตเฉพาะที่เกี่ยวข้องกับองค์ประกอบภาพ ฉันทำเบรกพอยต์จำนวนมากไม่เพียง แต่ในโค้ดของฉันเองเท่านั้น แต่ยังรวมถึง angular.js ด้วย แต่บางครั้งมันก็ไม่ใช่วิธีที่มีประสิทธิภาพมากที่สุด แม้ว่าวิธีการด้านล่างจะมีประสิทธิภาพมาก แต่ก็ถือว่าเป็นการปฏิบัติที่ไม่ดีอย่างแน่นอนหากคุณใช้ในรหัสการผลิตจริง ๆ ดังนั้นจงใช้อย่างชาญฉลาด!
ในเบราว์เซอร์ที่ไม่ใช่ IE จำนวนมากคุณสามารถเลือกองค์ประกอบได้โดยคลิกขวาที่องค์ประกอบแล้วคลิก "ตรวจสอบองค์ประกอบ" หรือคุณสามารถคลิกที่องค์ประกอบใดก็ได้ในแท็บองค์ประกอบใน Chrome เช่น องค์ประกอบที่เลือกล่าสุดจะถูกเก็บไว้ในตัวแปร$0
ในคอนโซล
ขึ้นอยู่กับว่ามีคำสั่งที่สร้างขอบเขตแยกคุณสามารถดึงขอบเขตโดยangular.element($0).scope()
หรือangular.element($0).isolateScope()
(ใช้$($0).scope()
ถ้าเปิดใช้งาน $) นี่คือสิ่งที่คุณจะได้รับเมื่อคุณใช้ Batarang เวอร์ชันล่าสุด หากคุณกำลังเปลี่ยนค่าโดยตรงอย่าลืมใช้scope.$digest()
เพื่อแสดงการเปลี่ยนแปลงบน UI
ไม่จำเป็นสำหรับการดีบัก 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
และทุกอย่าง
นอกจากนี้ยังมี $ log ที่คุณสามารถใช้ได้! ใช้ประโยชน์จากคอนโซลของคุณในแบบที่คุณต้องการให้ทำงาน!
แสดงข้อผิดพลาด / คำเตือน / ข้อมูลตามที่คอนโซลของคุณแสดงตามปกติ!
ใช้สิ่งนี้> เอกสาร
แม้จะมีการตอบคำถาม แต่ก็น่าสนใจที่จะดูng-inspector
ลอง ng-inspector ดาวน์โหลด Add-on สำหรับ Firefox จากเว็บไซต์http://ng-inspector.org/ http://ng-inspector.org/ไม่มีในเมนูเพิ่มของ Firefox
http://ng-inspector.org/ - เว็บไซต์
http://ng-inspector.org/ng-inspector.xpi - Firefox Add-on
น่าเสียดายที่ส่วนเสริมและส่วนขยายเบราว์เซอร์ส่วนใหญ่แสดงค่าให้คุณเห็น แต่ไม่อนุญาตให้คุณแก้ไขตัวแปรขอบเขตหรือเรียกใช้ฟังก์ชันเชิงมุม หากคุณต้องการเปลี่ยนตัวแปร $ ขอบเขตในคอนโซลเบราว์เซอร์ (ในทุกเบราว์เซอร์) คุณสามารถใช้ 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;
ผลลัพธ์จะแสดงในคอนโซลทันที
เพิ่มการโทรไปยังdebugger
ตำแหน่งที่คุณต้องการใช้
someFunction(){
debugger;
}
ใน console
แท็บของเครื่องมือสำหรับนักพัฒนาเว็บเบราว์เซอร์ของคุณปัญหาangular.reloadWithDebugInfo();
ไปที่หรือโหลดหน้าที่คุณต้องการแก้ไขข้อบกพร่องซ้ำและดูตัวแก้ไขข้อบกพร่องปรากฏในเบราว์เซอร์ของคุณ
var rootEle = document.querySelector("html");
var ele = angular.element(rootEle);
ขอบเขต () เราสามารถดึง $ ขอบเขตจากองค์ประกอบ (หรือพาเรนต์) โดยใช้วิธีการขอบเขต () บนองค์ประกอบ:
var scope = ele.scope();
หัวฉีด ()
var injector = ele.injector();
ด้วยหัวฉีดนี้เราสามารถสร้างอินสแตนซ์วัตถุ Angular ใด ๆ ภายในแอพของเราได้เช่นบริการตัวควบคุมอื่น ๆ หรือวัตถุอื่น ๆ
คุณสามารถเพิ่ม 'ดีบักเกอร์' ในโค้ดของคุณและโหลดแอพซ้ำซึ่งจะทำให้เบรกพอยต์อยู่ตรงนั้นและคุณสามารถ 'ก้าวข้าม' หรือเรียกใช้
var service = {
user_id: null,
getCurrentUser: function() {
debugger; // Set the debugger inside
// this function
return service.user_id;
}
คุณสามารถแก้ไขข้อบกพร่องโดยใช้เบราว์เซอร์ที่สร้างขึ้นในเครื่องมือสำหรับนักพัฒนา
เปิดเครื่องมือสำหรับนักพัฒนาในเบราว์เซอร์และไปที่แท็บแหล่งที่มา
เปิดไฟล์ที่คุณต้องการแก้จุดบกพร่องโดยใช้ Ctrl + P และค้นหาชื่อไฟล์
เพิ่มจุดพักในบรรทัด ny คลิกที่ด้านซ้ายของรหัส
รีเฟรชหน้า
มีปลั๊กอินมากมายสำหรับการดีบักที่คุณสามารถอ้างถึงการใช้ปลั๊กอิน Chrome Debug Angular Application โดยใช้ปลั๊กอิน"Debugger for chrome"
สำหรับ 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 โดยเปิดใช้งานการดีบักระยะไกลเพื่อให้ส่วนขยายแนบกับมัน
คลิกขวาที่ทางลัดของ Chrome และเลือกคุณสมบัติในช่อง "เป้าหมาย" ต่อท้าย --remote-debugging-port = 9222 หรือในพรอมต์คำสั่งเรียกใช้ /chrome.exe --remote-debugging-port = 9222
ในเทอร์มินัลรัน / Applications / Google \ Chrome.app/Contents/MacOS/Google \ Chrome --remote-debugging-port = 9222
ในเทอร์มินัลให้เปิด google-chrome --remote-debugging-port = 9222
เนื่องจากส่วนเสริมไม่ทำงานอีกต่อไปชุดเครื่องมือที่มีประโยชน์ที่สุดที่ฉันพบคือใช้ Visual Studio / IE เพราะคุณสามารถตั้งค่าเบรกพอยต์ใน JS ของคุณและตรวจสอบข้อมูลของคุณด้วยวิธีนั้น แน่นอน Chrome และ Firefox มีเครื่องมือ dev ที่ดีกว่าโดยทั่วไป นอกจากนี้ console.log () ที่ดียังมีประโยชน์มาก!
บางทีคุณอาจใช้Angular Augury A Google Chrome Dev Tools สำหรับการดีบักแอปพลิเคชัน Angular 2 ขึ้นไป