Ionic 2 / Anuglar 2如何将父函数移动到扩展类

时间:2017-03-28 09:07:02

标签: class angular typescript ionic2 extend

我的父组件太大而无法管理,因此我想将这些函数移动到扩展父级的分离子类中。

父类包含需要在子类中更新的变量,以及我已将提供者注入父类。

    @Component({
    selector: 'events-list',
    templateUrl: 'events-list.html'

})
export class EventsListComponent {
    filterString: string;
    infiniteScroll: any;
    refresher: any;
    eventsList: any[];
    selectedCategoriesList: [Category];
    pageNum: number;
    pageSize: number;
    searchText: string = '';
    noEvents: boolean;
    filterSearchText: string;
    filterStartDate: string;
    filterEndDate: string;
    tabsFilterValue: string = 'all'

    constructor(

        public authSrvc: AuthSrvc,
        public calendarSrvc: CalendarSrvc,
        public eventsSrvc: EventsSrvc,
        public helperSrvc: HelperSrvc,
        public locationSrvc: LocationSrvc,
        public pushSrvc: PushSrvc) {

    }
  

以上是我的父类

    import {Injectable} from '@angular/core';
import {Response} from '@angular/http';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/timeout';
import 'rxjs/add/observable/of';
import {Observable} from 'rxjs/Observable';
import {ModalController, LoadingController, NavController, ToastController, Platform} from 'ionic-angular';
import {Storage} from '@ionic/storage';
import {DateFormatPipe} from 'angular2-moment';
import {Category} from '../../../app/app.interfaces';
import * as moment from 'moment';

/** Ionic Native **/
import {GoogleAnalytics} from '@ionic-native/google-analytics';
import {Network} from '@ionic-native/network';

/** Providers **/
import {AuthSrvc} from '../../../../providers/auth-srvc';
import {CalendarSrvc} from '../../../../providers/calendar-srvc';
import {EventsSrvc} from '../../../../providers/events-srvc';
import {HelperSrvc} from '../../../../providers/helper-srvc';
import {LocationSrvc} from '../../../../providers/location-srvc';
import {PushSrvc} from '../../../../providers/push-srvc';

/** Pages **/
import {AuthPage} from '../../../pages/auth/auth-page';

import {EventsListComponent} from '../../../events-components/events-list/events-list';

export class eventsInit extends EventsListComponent {

    constructor(
        loadingCtrl: LoadingController,
        toastCtrl: ToastController,
        modalCtrl: ModalController,
        navCtrl: NavController,
        platform: Platform,
        storage: Storage,

        ga: GoogleAnalytics,
        network: Network,

        authSrvc: AuthSrvc,
        calendarSrvc: CalendarSrvc,
        eventsSrvc: EventsSrvc,
        helperSrvc: HelperSrvc,
        locationSrvc: LocationSrvc,
        pushSrvc: PushSrvc

    ) {
        super(loadingCtrl,
        toastCtrl,
        modalCtrl,
        navCtrl,
        platform,
        storage,

        ga,
        network,

        authSrvc,
        calendarSrvc,
        eventsSrvc,
        helperSrvc,
        locationSrvc,
        pushSrvc);
    }

    ngOnInit()
    {
        console.log('test')
    }
}
  

以上是我的孩子班级

这不起作用,并且总是因参数未填充或超级调用失败而失败。这样做的正确方法是什么。

/ **更新** /

如果删除注射剂我总是得到错误无法解决eventsInit的所有参数:(?,?,?,?,?,?)。

  

以下是我的主要模块

    import {NgModule, ErrorHandler} from '@angular/core';
import {FormsModule} from '@angular/forms';
import {Ng2ImgFallbackModule} from 'ng2-img-fallback';
import {CloudSettings, CloudModule} from '@ionic/cloud-angular';
import {MomentModule,DateFormatPipe} from 'angular2-moment';
import { IonicStorageModule } from '@ionic/storage';

import {IonicApp, IonicModule, IonicErrorHandler} from 'ionic-angular';
import {EnvironmentsModule} from '../environment_variables/environment_variables.module'
import {AppConfig} from '../app/app.config';
import {MyApp} from '../app/app.component';

/** Ionic Native **/
import {Calendar} from '@ionic-native/calendar';
import { Diagnostic } from '@ionic-native/diagnostic';
import {Facebook} from '@ionic-native/facebook';
import {GooglePlus} from '@ionic-native/google-plus';
import { GoogleAnalytics } from '@ionic-native/google-analytics';
import { Keyboard } from '@ionic-native/keyboard';
import { LaunchNavigator, LaunchNavigatorOptions } from '@ionic-native/launch-navigator';
import {Network} from '@ionic-native/network';
import { SocialSharing } from '@ionic-native/social-sharing';
import { StatusBar } from '@ionic-native/status-bar';
import { SplashScreen } from '@ionic-native/splash-screen';

/** Pages **/
import {AuthPage} from '../pages/auth/auth-page';
import {EventsPage} from '../pages/events/events-page';
import {EventPage} from '../pages/event/event-page';
import {ProfilePage} from '../pages/profile/profile';
import {SettingsPage} from '../pages/settings/settings';

/** Components **/
//Auth
import {LoginComponent} from '../components/auth-components/login/login';
import {ForgotPasswordDirective} from '../components/auth-components/forgot-password';
import {RegisterComponent} from '../components/auth-components/register/register';
import {SocialComponent} from '../components/auth-components/social/social';
import {WalkthroughComponent} from '../components/auth-components/walkthrough/walkthrough';
//Base
import {SidenavComponent} from '../components/sidenav/sidenav';
import {TimeslotFilterComponent} from '../components/timeslot-filter/timeslot-filter';
import {SettingsComponent} from '../components/settings/settings';
import {EventBookComponent} from '../components/event-book/event-book';
//Events
import {EventsFilterComponent} from '../components/events-components/events-filter/events-filter';
import {EventsListComponent} from '../components/events-components/events-list/events-list';
    /** Events Extensions **/
    import {eventsInit} from '../components/events-components/events-list/extensions/events-init';
import {EventsItemComponent} from '../components/events-components/events-item/events-item';
//Event
import {AttendeesListComponent} from '../components/event-components/attendees-list/attendees-list';
import {AttendeesItemComponent} from '../components/event-components/attendees-item/attendees-item';
//Profile
import {ProfileComponent} from '../components/profile/profile';

import {ParallaxHeaderDirective} from '../components/parallax-header';

/** Providers **/
import {EventsSrvc} from '../providers/events-srvc';
import {AuthSrvc} from '../providers/auth-srvc';
import {CalendarSrvc} from '../providers/calendar-srvc';
import {HelperSrvc} from '../providers/helper-srvc';
import {LocationSrvc} from '../providers/location-srvc';
import {PushSrvc} from '../providers/push-srvc';

/** Pipes **/
import {LimitToPipe} from '../pipes/limitTo'

const cloudSettings: CloudSettings = {
    'core': {
        'app_id': 'df0d4e63'
    }
};

class NetworkMock extends Network { 
 get type(): string {
    return (super['type'] === null) ? "wifi" : super['type'];
  }
}

@NgModule({
    declarations: [
        MyApp,
        AuthPage,
        LoginComponent,
        ForgotPasswordDirective,
        ParallaxHeaderDirective,
        RegisterComponent,
        SocialComponent,
        WalkthroughComponent,
        SidenavComponent,
        EventsPage,
        EventsListComponent,
        eventsInit,
        EventsItemComponent,
        EventsFilterComponent,
        AttendeesListComponent,
        AttendeesItemComponent,
        EventPage,
        ProfilePage,
        ProfileComponent,
        SettingsPage,
        SettingsComponent,
        TimeslotFilterComponent,
        EventBookComponent,
        LimitToPipe,
    ],
    imports: [
        IonicModule.forRoot(MyApp,
            {
                backButtonText: 'Back',
                backButtonIcon: 'arrow-back',
                iconMode: 'md',
                modalEnter: 'modal-slide-in',
                modalLeave: 'modal-slide-out',
                tabsPlacement: 'bottom',
                pageTransition: 'md',
                mode: 'md'
            }),
            IonicStorageModule.forRoot(),
        CloudModule.forRoot(cloudSettings),
        FormsModule,
        MomentModule,
        EnvironmentsModule,
        Ng2ImgFallbackModule
    ],
    bootstrap: [IonicApp],
    entryComponents: [
        MyApp,
        AuthPage,
        EventsPage,
        EventPage,
        ProfilePage,
        SettingsPage,
        EventBookComponent,
        EventsFilterComponent,
        SidenavComponent
    ],
    providers: [{provide: ErrorHandler, useClass: IonicErrorHandler},
    Calendar,
    Diagnostic,
    Facebook,
    GooglePlus,
    DateFormatPipe,
    GoogleAnalytics,
    Keyboard,
    LaunchNavigator,
    { provide: Network, useClass: NetworkMock },
    SocialSharing,
    StatusBar,
    SplashScreen, 
    EventsSrvc,
    AuthSrvc,
    CalendarSrvc,
    HelperSrvc,
    EventsSrvc, 
    LocationSrvc,
    AppConfig]
})
export class AppModule {

}

2 个答案:

答案 0 :(得分:1)

我认为你必须遵循下面提到的实现。我已经在我的应用程序中实现了它并且它工作正常。

注意:这只是一个结构。请按照您的意愿实施。

您的组件类:

import { eventsInit } from "../../path-for-it";

    export class EventsListComponent extends eventsInit {

      constructor() {
        super();

      }

基类:

 export abstract class eventsInit {


      protected YourMethodName(res: Response) {

      }


    }

更新:

您似乎没有遵循provider实施的最新更改。您必须在app.module.ts文件中声明它。请参阅此文章:Providers

答案 1 :(得分:0)

所以在将扩展类逻辑敲入我的脑海并理解它不是分解我的代码的正确方法之后。我使用了@Hostlistener和@Input变量的基于属性的指令。

我能够将父组件拆分成更小的部分,并允许父组件保存所有变量并将更新的值传递给指令。我从1个组件超过500行到多个不超过120.更容易阅读,测试和维护。