如何减轻标签点击?

Posted

技术标签:

【中文标题】如何减轻标签点击?【英文标题】:How can mitigate a tab click? 【发布时间】:2017-12-31 02:12:50 【问题描述】:

我有一个标签组:

<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>

当用户单击第二个选项卡(“工作室”)时,我需要检查他们是否可以访问它。如果他们这样做,很好,如果他们不这样做,我想显示一个 toast 通知并加载第一个标签。

我该怎么做?

我认为return false 足以满足studioCheck(),但事实并非如此。

打字稿:

  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;
      
    );
  

我认为ionSelect 可能不会等待异步的storage.get 调用,所以我只是在函数顶部做了一个return false;,但效果相同。

有什么想法吗?

【问题讨论】:

【参考方案1】:

像这样调整视图

<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>

然后在控制器中:

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);
            
        );
    

说明

为了在代码中切换选项卡,您必须获取Tabs 的实例并在其上调用select。 记住ionSelect是在标签被选中时发出的,所以返回值被忽略。 由于this.storage.get,您的代码是异步的,所以return false; 无论如何都不要离开studioCheck 方法

【讨论】:

这仍然有相同的结果。原因是this.storage.get 是异步的,所以标签切换无需等待存储调用。 是的标签切换,但它应该很快返回到第一个标签,以防它被限制..这就是“this.tabs.select(0)”的目的 它失败了,因为我要切换到的选项卡运行,我想阻止它,因为它需要的存储中的数据不存在。我知道我可以在该页面中添加逻辑以防止这种情况发生,但我希望有一种方法根本不打开选项卡,而不是打开然后关闭它 hm,离子选项卡上有“启用”属性,但我想这不是你的选择,因为你希望选项卡是可点击的。您将需要自己的 ion-tabs 实现,有可用的源代码,您可以从中获得灵感:github.com/ionic-team/ionic/blob/master/src/components/tabs/…

以上是关于如何减轻标签点击?的主要内容,如果未能解决你的问题,请参考以下文章

如何创建可点击标签[关闭]

如何在目标c中使用用户点击手势获取标签标签

IOS swift如何在标签点击时在TableView中获取标签文本

如何检测是不是点击了 UI 标签?

JAVAFX 如何使堆叠在标签后面的按钮可点击

Swift - 点击按钮时如何测试标签是不是已更新