angular - Ako môžem zmierniť kliknutie na kartu?


Mám skupinu kariet:

<ion-tabs>
  <ion-tab [root]="tab1Root" tabTitle="Programmes" tabIcon="icon-programmes"></ion-tab>
  <ion-tab [root]="tab2Root" (ionSelect)="studioCheck()" tabTitle="Studio" tabIcon="icon-studio"></ion-tab>
  <ion-tab [root]="tab3Root" tabTitle="Library" tabIcon="icon-library"></ion-tab>
  <ion-tab [root]="tab4Root" tabTitle="Profile" tabIcon="icon-profile"></ion-tab>
</ion-tabs>

Keď používateľ klikne na druhú kartu ('Studio'), potrebujem skontrolovať, či k nej už má prístup. Ak áno, skvelé, ak nie, chcem zobraziť toast notifikáciu a načítať prvú kartu.

Ako to môžem urobiť?

Myslel som si, že return false by stačilo pri studioCheck(), ale nestačí.

Typescript :

  studioCheck() {
    console.log('Studio visited');

    // Grab studio selected level
    this.storage.get('studio_level').then((val) => {
      console.log('Storage queried');
      if(val) {
        console.log('Level ID: ', val);
        return true;
      } else {
        // No level selected
        let toast = this.toastCtrl.create({
          message: 'Please choose a programme in order to use the Studio',
          duration: 3000,
          position: 'top'
        });
        toast.present();
        this.navCtrl.parent.select(0);
        return false;
      }
    });
  }

Myslel som si, že možno ionSelect nečaká na asynchrónne volanie storage.get, tak som jednoducho dal return false; na začiatok funkcie, ale to robí to isté.

Má niekto nejaké nápady?

Odpoveď č. 1

nastaviť zobrazenie takto

<ion-tabs #tabs>
  <ion-tab [root]="tab1Root" tabTitle="Programmes" tabIcon="icon-programmes"></ion-tab>
  <ion-tab [root]="tab2Root" (ionSelect)="studioCheck()" tabTitle="Studio" tabIcon="icon-studio"></ion-tab>
  <ion-tab [root]="tab3Root" tabTitle="Library" tabIcon="icon-library"></ion-tab>
  <ion-tab [root]="tab4Root" tabTitle="Profile" tabIcon="icon-profile"></ion-tab>
</ion-tabs>

a potom v kontroléri:

export class MyPage {
    @ViewChild("tabs") public tabs: Tabs;
    ...

    studioCheck() {
        console.log('Studio visited');

        // Grab studio selected level
        this.storage.get('studio_level').then((val) => {
            console.log('Storage queried');
            if(val) {
                console.log('Level ID: ', val);
                return true;
            } else {
                // No level selected
                let toast = this.toastCtrl.create({
                  message: 'Please choose a programme in order to use the Studio',
                  duration: 3000,
                  position: 'top'
                });
                toast.present();
                this.tabs.select(0);
            }
        });
    }
}

Vysvetlenie

  • Aby ste mohli prepínať karty v kóde, musíte získať inštanciu Tabs a zavolať na nej select.
  • Majte na pamäti, že ionSelect sa vysiela, keď je karta vybraná, takže návratová hodnota sa ignoruje.
  • kvôli this.storage.get, váš kód je asynchrónny, takže return false; nemôže metódu studioCheck opustiť tak či tak