在Ionic 2上动态更新标签徽章

the*_*xer 3 javascript typescript ionic2 ionic3 angular

我希望在单击按钮时动态更新徽章值.

tabs.html

...
        <ion-tab [root]="tab1Root" tabTitle="Product" tabIcon="search"></ion-tab>
        <ion-tab [root]="tab2Root" tabTitle="Cart" tabIcon="cart" tabBadge="{{cartCount}}" tabBadgeStyle="danger"></ion-tab>
...
Run Code Online (Sandbox Code Playgroud)

tabs.ts

export class TabsPage {
...
    cartCount = 0;

    tab1Root = ProductPage;
    tab2Root = CartPage;
...
}
Run Code Online (Sandbox Code Playgroud)

product.html

<button ion-button full (click)="updateCart('add', p.id)">Buy Now</button>
Run Code Online (Sandbox Code Playgroud)

product.ts

export class ProductPage {
...
    updateCart(action, id) {
        let cartCount = 1;

        let alert = this.alertCtrl.create({
            title: 'Success!',
            subTitle: 'You have added 1 product to the cart.',
            buttons: ['OK']
        });

        alert.present();
    }
...
}
Run Code Online (Sandbox Code Playgroud)

正如我所说,let cartCount = 1;什么都不做.我已经找到了一个解决方案,但大多数都是针对Ionic 1或AngularJS,它根本没有帮助我.

seb*_*ras 6

你可以使用Ionic事件.请看看这个工作的plunker.就像你可以看到的那样,在第一个标签中我们发布了一个需要更新徽章的事件:

import { Component } from '@angular/core';
import { Events } from 'ionic-angular';

@Component({..})
export class FirstTabPage {

  private count: number = 0;

  constructor(public events: Events) {}

  public updateTabBadge(): void {
    this.events.publish('cart:updated', ++this.count);
  }

}
Run Code Online (Sandbox Code Playgroud)

然后我们在包含两个选项卡的页面中订阅该事件:

import { Component } from '@angular/core';
import { Events } from 'ionic-angular';

@Component({...})
export class FirstTabPage {

  private count: number = 0;

  constructor(public events: Events) {}

  public updateTabBadge(): void {
    this.events.publish('cart:updated', ++this.count);
  }

}
Run Code Online (Sandbox Code Playgroud)

在视图中:

<ion-header>
  <ion-navbar>
    <ion-title>Tabs</ion-title>
  </ion-navbar>
</ion-header>
<ion-tabs #myTabs>
  <ion-tab [root]="tab1Root" tabTitle="First Tab"></ion-tab>
  <ion-tab [root]="tab2Root" tabTitle="Second Tab" [tabBadge]="cartCount"></ion-tab>
</ion-tabs>
Run Code Online (Sandbox Code Playgroud)

另请注意,应使用属性绑定而不是字符串插值来绑定tabBadge属性:[tabBadge]="cartCount"


UPDATE

就像@skinny_jones在评论中提到的,你也可以使用Subjects/ Observables来达到同样的效果.您可以在此博客文章中找到更多信息