javascript - ฟังก์ชันลูกศรหนา (fat arrow) ถูกเขียนใหม่เป็นฟังก์ชันปกติ 'this' เป็น undefined
ฉันกำลังพยายามแปลงแอปของฉันไปเป็น Ionic2 และกำลังเจอปัญหาอีกครั้ง ฉันมีโค้ดดังต่อไปนี้:
this.database.query("SELECT whatever FROM tab WHERE field = ?", [someVar]).then(
(result) => {
this.database.query...
ฉันใช้ฟังก์ชันลูกศรเพื่อให้แน่ใจว่าฉันยังสามารถอ้างอิงถึง 'this' ได้ และสามารถเรียกใช้ฐานข้อมูลอีกครั้งได้ (หมายเหตุ this.database เป็นบริการที่ฟังก์ชัน query คืนค่า Promise)
อย่างไรก็ตาม สิ่งนี้ล้มเหลวพร้อมกับข้อผิดพลาด "Uncaught (in promise): TypeError: Cannot read property 'database' of null" เมื่อฉันดีบัก ฉันสามารถเห็นได้จริง ๆ ว่า 'this' เป็น undefined
เมื่อฉันดูที่ซอร์สโค้ดของอีมูเลเตอร์ ฉันเห็นโค้ดต่อไปนี้ (ฟังก์ชันถูกเพิ่มเข้ามา)
this.database.query("SELECT whatever FROM tab WHERE field = ?", [someVar]).then(
function (result) {
this.database.query...
มันปกติหรือที่สิ่งนี้ถูกเพิ่มเข้ามา? เพราะมันทำให้โค้ดของฉันพัง นอกจากนี้ไม่มีตัวแปรอื่นที่ถูกสร้างขึ้นเพื่อเก็บการอ้างอิงถึง 'this' จะแก้ไขอย่างไร?
การตั้งค่าของฉัน:
Typescript 2 installed
"@angular/common": "2.0.0",
"@angular/compiler": "2.0.0",
"@angular/compiler-cli": "0.6.2",
"ionic-angular": "2.0.0-rc.1",
"ionic-native": "2.2.3",
"rxjs": "5.0.0-beta.12",
"zone.js": "0.6.21"
"@ionic/app-scripts": "^0.0.36",
"typescript": "^2.0.3"
"module": "es2015",
"moduleResolution": "node",
"target": "es5"
แก้ไข: Plunkr ทำซ้ำโดยแยกมาจากตัวอย่าง Ionic2 ที่นั่นมันใช้งานได้ แก้ไข2: Plunker ข้างต้นใช้ไลบรารี Typescript 1.7 ฉันพยายามสร้าง Plunkr ใหม่ แต่ไม่สามารถทำให้มันใช้งานได้
แก้ไขขั้นสุดท้าย ในที่สุดมันก็ใช้งานได้แล้ว แต่ฉันไม่สามารถระบุสาเหตุได้ ฉันกำลังติดตามการเปลี่ยนแปลงทั้งหมดในซอร์สโค้ดผ่าน git และสิ่งที่ต่างออกไปเพียงอย่างเดียวคือระหว่างนั้นฉันลองใช้ ES6 เป็น target และฉันได้เพิ่ม - แต่ก็เอาออกแล้ว - crosswalk นอกจากนี้ฉันยังสร้างสำหรับ Android ในช่วงเวลานั้นด้วย บางทีการแปลง ES6 หรือการสร้าง Android อาจเหลือโค้ดบางส่วนที่มีประโยชน์? น่ารำคาญมากที่ไม่รู้สาเหตุ..
ยังไงก็แล้วแต่ ผมคงจะไม่ลองวิเคราะห์ต่อไปเพราะผมเจอปัญหากับ Ionic2 อยู่เรื่อยๆ มันดูเหมือนยังไม่ค่อยมีความเสถียร ปัญหาปัจจุบันมีตั้งแต่: หน้าจอดำ หน้าจอขาว เนื้อหาซ่อนอยู่หลังหัวข้อ ไอคอนแอปผิดบน iOS พฤติกรรมประหลาดบ่อย ๆ ปัญหาเรื่องเลย์เอาต์บน Android,.. ดังนั้นในช่วงนี้ผมจะกลับไปใช้ Ionic1 :"(