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

angular - จำเป็นต้องใช้เมธอด platform.ready() ของ Ionic


ฉันมีคำถามพื้นฐานเกี่ยวกับวิธี platform.ready().then(() => {}) เราจำเป็นต้องใช้วิธีนี้ทุกครั้งที่เราใช้ปลั๊กอินเนทีฟหรือไม่? เช่น Status bar หรือ LocalStorage หรืออื่น ๆ?

จะไม่พอหรือถ้าเราใช้วิธีข้างต้นแค่ในไฟล์ app.component.ts เท่านั้นเพราะมันคือคอมโพเนนต์ราก หลังจากคอมโพเนนต์รากนี้ หวังว่า platform จะพร้อมสำหรับคอมโพเนนต์อื่น ๆ ต่อไปทั้งหมดใช่ไหม แล้วทำไมเราต้องใช้วิธี ready ในคอมโพเนนต์ลูกอื่น ๆ ทุกตัวด้วย? เพราะฉันเห็นบทความและวิดีโอหลายอันที่ใช้ ถ้ามีปลั๊กอินเนทีฟ หวังว่านี่คงไม่จำเป็นใช่ไหม?

ในเอกสารทางการนี้ คุณสามารถเห็นว่ามันถูกใช้ภายในคอมโพเนนต์ลูกด้วยใช่ไหม? คุณคิดเห็นอย่างไร? platform.ready().then(() => {})

คำตอบ #1

platform.ready() เป็นคำสัญญาที่จะทำงานเสร็จเมื่ออุปกรณ์หรือปลั๊กอินเนทีฟของคุณพร้อมใช้งาน

มาดูเทมเพลต ionic sidemenu starter https://github.com/ionic-team/ionic2-starter-sidemenu/blob/master/src/app/app.component.ts.

ดังที่คุณเห็นใน app.component.ts บรรทัดที่ 15 ค่า rootPage จะถูกตั้งค่าและจะถูกโหลดโดยเร็วที่สุด ใน constructor this.initializeApp(); จะถูกเรียก

this.platform.ready().then(() => {
  // Okay, so the platform is ready and our plugins are available.
  // Here you can do any higher level native things you might need.
  this.statusBar.styleDefault();
  this.splashScreen.hide();
});

เช่นเดียวกับพรอมิสทุกตัวในจาวาสคริปต์ คุณไม่สามารถบอกได้ว่าจะเกิดการแก้ไขเมื่อใด และตามที่คุณเห็นในโค้ด แอป Ionic ไม่ได้ "รอ" ให้แพลตฟอร์มพร้อม เพียงแค่คำสั่ง statusBar.styleDefault() และ splashScreen.hide() เท่านั้นที่รอพรอมิสนั้น

สมมติว่าการดำเนินการสัญญานั้นใช้เวลานานมากที่จะเสร็จสมบูรณ์ เช่น 5 วินาที

ถ้าคุณมีโค้ด ionic-native ใดๆ อยู่ใน HomePage, provider ใดๆ ที่คุณใช้ภายใน app.component.ts หรือหน้าอื่นๆ (เพราะผู้ใช้อาจจะนำทางรอบๆ แอปแล้วในช่วงเวลานั้น), การเรียกใช้ ionic-native จะล้มเหลวเพราะแพลตฟอร์มยังไม่พร้อม

ตัวอย่างเช่น:

 constructor(public platform: Platform, public statusBar: StatusBar, public splashScreen: SplashScreen, private: qrScanner: QrScanner) {
      this.initializeApp();

      this.qrScanner.scan(); // Let's assume this is a provider we made to start a QR scanner. It will try to load the scanner immediately, regardless of the state of the platform.ready() promise. So if the platform is not ready, it will crash.

      // used for an example of ngFor and navigation
      this.pages = [
        { title: 'Home', component: HomePage },
        { title: 'List', component: ListPage }
      ];

  }

นั่นหมายความว่าทฤษฎีแล้ว คุณควรใช้ this.platform.ready() เสมอเมื่อใช้ปลั๊กอินเนทีฟเพื่อให้แน่ใจว่าพลตฟอร์มพร้อมใช้งาน ในทางปฏิบัติจริง มันขึ้นอยู่กับกรณีเฉพาะเพราะบ่อยครั้งที่พลตฟอร์มพร้อมใช้งานอย่างรวดเร็วและคุณอาจไม่สังเกตเห็นความแตกต่างหากไม่ใช้มัน แต่ถ้าคุณต้องการความแน่ใจ คุณควรใช้มันทุกที่

บทความที่เกี่ยวข้อง