ฉันยังอยากรู้ว่าฉันจะพบสถานที่ในซอร์สโค้ดของเราที่ทำให้เกิดปัญหานี้ได้อย่างไร แต่หลังจากนั้นฉันก็สามารถค้นหาปัญหาด้วยตนเองได้
มีการประกาศฟังก์ชันคอนโทรลเลอร์ในขอบเขตส่วนกลางแทนที่จะใช้การ.controller()
โทรบนโมดูลแอปพลิเคชัน
จึงมีบางอย่างดังนี้:
function SomeController( $scope, i18n ) { /* ... */ }
มันใช้งานได้ดีสำหรับ AngularJS แต่เพื่อให้ทำงานได้อย่างถูกต้องด้วยการโกงฉันต้องเปลี่ยนเป็น:
var applicationModule = angular.module( "example" );
function SomeController( $scope, i18n ) { /* ... */ }
applicationModule.controller( "SomeController", [ "$scope", "i18n", SomeController ] );
หลังจากการทดสอบเพิ่มเติมฉันพบอินสแตนซ์ของคอนโทรลเลอร์จำนวนมากที่ทำให้เกิดปัญหาเช่นกัน นี่คือวิธีที่ฉันพบแหล่งที่มาของทั้งหมดด้วยตนเอง :
ก่อนอื่นฉันคิดว่ามันค่อนข้างสำคัญในการเปิดใช้งานการตกแต่งเอาต์พุตในตัวเลือกอัปลักษณ์ สำหรับงานฮึดฮัดของเราที่หมายถึง:
options : {
beautify : true,
mangle : true
}
จากนั้นฉันก็เปิดเว็บไซต์โครงการใน Chrome โดยเปิด DevTools ซึ่งส่งผลให้เกิดข้อผิดพลาดเช่นเดียวกับการบันทึกด้านล่าง:
วิธีในการติดตามการโทรที่เราสนใจคือวิธีที่ฉันทำเครื่องหมายด้วยลูกศร นี่คือproviderInjector
ในinjector.js
. คุณจะต้องวางเบรกพอยต์ที่มีข้อยกเว้น:
เมื่อคุณเรียกใช้แอปพลิเคชันอีกครั้งเบรกพอยต์จะถูกโจมตีและคุณสามารถกระโดดขึ้นกลุ่มการโทรได้ จะมีสายเรียกเข้าจากinvoke
ในinjector.js
สตริง "โทเค็นการฉีดไม่ถูกต้อง":
locals
พารามิเตอร์ (mangled ไปd
ในรหัสของฉัน) ช่วยให้ความคิดที่ดีงามเกี่ยวกับการที่วัตถุที่อยู่ในแหล่งที่มาของปัญหาคือ:
การgrep
ค้นหาแหล่งที่มาของเราอย่างรวดเร็วพบหลายกรณีmodalInstance
แต่เมื่อไปจากที่นั่นจะพบจุดนี้ได้ง่ายในแหล่งที่มา:
var ModalCreateEditMeetingController = function( $scope, $modalInstance ) {
};
ซึ่งต้องเปลี่ยนเป็น:
var ModalCreateEditMeetingController = [ "$scope", "$modalInstance", function( $scope, $modalInstance ) {
} ];
ในกรณีที่ตัวแปรไม่เก็บข้อมูลที่เป็นประโยชน์คุณยังสามารถกระโดดขึ้นไปอีกด้านบนสแต็กและคุณควรโทรออกinvoke
ซึ่งควรมีคำแนะนำเพิ่มเติม:
ป้องกันไม่ให้เกิดเหตุการณ์เช่นนี้อีก
ตอนนี้คุณหวังว่าจะพบปัญหาแล้วฉันรู้สึกว่าควรพูดถึงวิธีที่ดีที่สุดเพื่อหลีกเลี่ยงไม่ให้เกิดขึ้นอีกในอนาคต
เห็นได้ชัดว่าคุณสามารถใช้คำอธิบายประกอบอาร์เรย์แบบอินไลน์ได้ทุกที่หรือใช้$inject
คำอธิบายประกอบคุณสมบัติ (ขึ้นอยู่กับความชอบของคุณ) และพยายามอย่าลืมมันในอนาคต หากคุณทำเช่นนั้นตรวจสอบให้แน่ใจว่าได้เปิดใช้งานโหมดการฉีดพึ่งพาอย่างเข้มงวดเพื่อตรวจจับข้อผิดพลาดเช่นนี้ตั้งแต่เนิ่นๆ
ระวัง! ในกรณีที่คุณใช้ Angular Batarang StrictDI อาจไม่ได้ผลสำหรับคุณเนื่องจาก Angular Batarang จะฉีดรหัสที่ไม่ได้ระบุลงในของคุณ (Batarang ไม่ดี!)
หรือคุณอาจให้ng-annotateดูแลก็ได้ ฉันขอแนะนำให้ทำเช่นนั้นเนื่องจากจะช่วยขจัดความผิดพลาดที่อาจเกิดขึ้นในพื้นที่นี้ออกไปได้มากเช่น
- ไม่มีคำอธิบายประกอบ DI
- คำอธิบายประกอบ DI ไม่สมบูรณ์
- คำอธิบายประกอบ DI ผิดลำดับ
การทำให้คำอธิบายประกอบเป็นปัจจุบันเป็นเพียงความเจ็บปวดที่ตูดและคุณไม่ควรทำถ้าทำได้โดยอัตโนมัติ ng-annotate ทำอย่างนั้น
มันควรบูรณาการอย่างเป็นขั้นตอนการสร้างของคุณด้วยเสียงฮึดฮัด-ng-บันทึกย่อและอึก-ng-คำอธิบายประกอบ