ค้นหาเว็บไซต์

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 :"(