Я скрываю вкладки в Ionic 2 для определенных @Page
(декоратор Ionic 2), используя простой TabsProvider
:
tabs.ts
import { Injectable } from 'angular2/core';
import { BehaviorSubject } from 'rxjs';
@Injectable()
export class TabsProvider {
currentState = new BehaviorSubject<boolean>(true);
public showTabs(){
this.currentState.next(true);
}
public hideTabs(){
this.currentState.next(false);
}
}
Компонент вкладок подписывается на currentState
, а TabsProvider
внедряется на различные страницы, как показано ниже:
sample-page.ts
:
import {Page} from 'ionic-angular';
import { TabsProvider } from './tabs';
@Page({
...
})
export class SamplePage {
tabsProvider: TabsProvider;
constructor(tabsProvider: TabsProvider) {
this.tabsProvider = tabsProvider;
}
onPageWillEnter(){
this.tabsProvider.hideTabs();
}
onPageWillLeave(){
this.tabsProvider.showTabs();
}
}
Этот код практически полностью шаблонный, и было бы намного чище, если бы я мог определить эту функциональность в декораторе (или аннотации), например:
import { Page } from 'ionic-angular';
import { hideTabs } from './tabs';
@hideTabs()
@Page({
...
})
export class BuyPage {
}
Но у меня возникли проблемы с определением того, как внедрить TabsProvider и добавить методы onPageWillEnter
и onPageWillLeave
в SamplePage.
Может ли декоратор (или аннотация) как-то внедрить дополнительных поставщиков Angular?
Самое далекое, что я получил до сих пор:
in tabs.ts
:
export function hideTabs() {
return function(cls: any) {
cls.prototype.onPageWillEnter = function() {
this.tabsProvider.hideTabs();
};
cls.prototype.onPageWillLeave = function() {
this.tabsProvider.showTabs();
};
return cls;
}
}
Это дает нам часть того, что мы ищем, но по-прежнему необходимо импортировать и внедрить TabsProvider
в качестве конкретного члена экземпляра:
sample-page.ts
import {Page, Events} from 'ionic-angular';
import { hideTabs, TabsProvider } from './tabs';
@hideTabs()
@Page({
...
})
export class SamplePage {
constructor(public tabsProvider: TabsProvider) {
}
}
Можно ли полностью абстрагировать это в @hideTabs()
?
Редактировать:
Соответствующие части компонента вкладок (для всех, кто заинтересован в реализации) pages/tabs/tabs.ts
:
import { Page } from 'ionic-angular';
import { TabsProvider } from './tabs';
@Page({
...
})
export class TabsPage {
...
currentState: boolean;
constructor(TabsProvider: TabsProvider) {
TabsProvider.currentState.subscribe((state: boolean) => {
this.currentState = state;
});
}
}
pages/tabs/tabs.html
:
<div [ngClass]="{'hide-tabs': !currentState}">
<ion-tabs>
...
</ion-tabs>
</div>
pages/tabs/tabs.scss
:
.hide-tabs ion-tabbar-section {
display: none;
}