【问题标题】:Dynamic Tabs with Global behaviourSubject?具有全局行为的动态选项卡主题?
【发布时间】:2017-07-07 05:08:59
【问题描述】:

我正在尝试根据您在 Ionic 应用程序中的位置隐藏和显示选项卡。我目前正在尝试使用全局布尔行为主题来实现这一点。为了简洁起见,我有以下代码已被修剪。

在我的提供者/服务 globals.ts 中,我有以下内容:

@Injectable() 
export class AppGlobals {
    public showActionTabs:BehaviorSubject<boolean> = new BehaviorSubject<boolean>(false);

    setShowActionTabs(val){
        this.showActionTabs.next(val);
    }

    getShowActionTabs(): Observable<boolean>{
        return this.showActionTabs.asObservable();
    }
}

然后在我的 tabs.ts 中有:

export class TabsPage {
    public showTabs: boolean;

    constructor(private _appGlobals: AppGlobals) {
        this._appGlobals.getShowActionTabs().subscribe((value:boolean) => {                    
            this.showTabs = value;
            console.log("new val: ", value, this.showTabs);
        });
    }

    ngOnInit() {
        setInterval(function() {
            console.log("inside init:", this.showTabs);
        }, 5000);
    }
}

在我的 products.ts 页面中,我有:

export class ProductsPage {

    constructor(private _appGlobals: AppGlobals) {}

    ngOnInit() {
        this._appGlobals.setShowActionTabs(true);
    }
}

在我的 product-details.ts 我有:

export class ProductDetails {

    constructor(private _appGlobals: AppGlobals) {}

    ngOnInit() {
        this._appGlobals.setShowActionTabs(false);
    }
}

最后在我的 tabs.html 中我有:

<ion-tabs class="side-tabs">
    <ion-tab *ngIf="showTabs" (ionSelect)="toggleSearch()" tabTitle="Search" tabIcon="custom-search"></ion-tab>
    <ng-container *ngFor="let tab of tabs; let i = index; trackBy: trackByFn">
        <ion-tab *ngIf="!tab.hasAction" tabTitle="{{ tab.title }}" tabIcon="{{ tab.icon }}"></ion-tab>
    </ng-container>
    <ion-tab *ngIf="showTabs" (ionSelect)="toggleCompare()" tabTitle="Compare" tabIcon="custom-compare"></ion-tab>
</ion-tabs>

但是,当我在页面之间导航时,标签仍然不会相应地隐藏和显示。

谁能解释我哪里出错了?我对这种方法的理解是,behaviourSubject 从其他类/组件中获取值,然后允许将其应用于其他地方。

提前致谢,非常感谢。如果您需要更多详细信息,请询问。

编辑

我的问题代码已更新以反映@Bhetzie 的答案。目前,尽管 this.showTabs 正在通过 behaviorSubject 正确设置,但据我所知,标签仍然没有显示或隐藏。

结果

所以经过一些广泛的挖掘后,我得出的结论是,离子标签是全局行为的罪魁祸首Subject/ngIf 似乎无法协同工作。我使用 Ionic 提供的侧面菜单模板将它们撕掉并制作了自己的标签。这解决了我的问题,现在选项卡会动态换出。

【问题讨论】:

    标签: javascript angular ionic-framework ionic2


    【解决方案1】:

    我认为您缺少 showActionTabs 的吸气剂。

    它总是将 showTabs 设置为行为主题被初始化的任何内容。

    你可以试试:

    service globals.ts

    getShowActionTabs(): Observable<boolean>{
            return this.showActionTabs.asObservable();
        }
    

    tabs.ts

    this._appGlobals.getShowActionTabs().subscribe((value:boolean) => { this.showTabs = value;
        console.log(value);
    });
    

    【讨论】:

    • 感谢您抽出宝贵时间提供帮助,这让我更进一步。我已经在构造函数中应用了选项卡代码。但是在 ngOnInit() 中,我设置了一个间隔以每 5 秒显示一次 this.showTabs 的值,但它返回未定义。这不应该设置为从您编写的选项卡代码行中提取的值吗?
    • 区间背后的想法究竟是什么?它最初是否显示一个值?我假设未定义是因为你有: this.showActionTabs.next(val);因此,如果您订阅一个间隔,则只有在初始化时设置的 false 值。我认为它的工作原理是,当设置新值时,例如通过产品页面,showTabs 将更改为最新的可观察值
    • 当我在 Products 和 Product-Details 页面之间导航时,我试图查看 this.showTabs 中的值是否会发生变化。但它从第一个间隔返回未定义。对不起,我可能正在尝试一些我不应该做的事情!哈哈。删除它,它会记录导航页面的真假之间的变化。但是,*ngIfs 不会改变。选项卡在设置为 false 时不会隐藏,它们仍然会显示。 :/ 抱歉,如果我没有意义,Angular 2 和 Ionic 我是在过去一周左右才开始学习的!
    • 在您提供的代码中,看起来这两个条件都设置为 showTabs?其中之一应该是 !showTabs 吗?我不熟悉离子,但如果可能的话,我可能会尝试类似:
    • 抱歉回复晚了,周末忘记看stack了!老实说,我使用的布尔值的名称可能有点误导。这两个选项卡应该一起显示和隐藏!但据我所知,两次应该不会影响结果。
    猜你喜欢
    • 2018-05-31
    • 2018-07-18
    • 1970-01-01
    • 1970-01-01
    • 2015-10-28
    • 2020-12-06
    • 2020-12-28
    • 2021-07-08
    • 1970-01-01
    相关资源
    最近更新 更多