2017-07-14 3 views
0

ホームページ(タブ1)。私は、オブジェクトionic別のタブにオブジェクトを渡す

@Component({ 
     selector: 'page-home', 
     templateUrl: 'home.html', 
     providers: [Data] 
    }) 
    export class HomePage { 
      constructor(public navCtrl: NavController,public navParams: NavParams, public dataService: Data, public nativeStorage: NativeStorage) { 
     } 
     postTapped(card:any){ 
    this.dataService.setSelectedCard(card); 
     console.log(card); 
    this.navCtrl.parent.select(1); 
} 
    addPost(){ 
     this.navCtrl.push(PostPage); 
} 

詳細ページタブ2.これは私がオブジェクトに

@Component({ 
      selector: 'page-detail', 
      templateUrl: 'detail.html', 
     }) 
     export class DetailPage { 
    card:any; 
    constructor(public navCtrl: NavController, dataService: Data, public navParams: NavParams,) { 
     console.log(this.card); 
     this.card= dataService.getSelectedCard(); 
    } 
} 

これを送りたいターゲットページでのリストからオプションをクリックし、ユーザーを希望する場所ですオブジェクトを格納するためのデータと呼ばれるプロバイダがある、私は、このサービスでオブジェクトを格納しようとしましたが、オブジェクトは、それは私がを通じて徹底的に見ている

@Injectable() 
export class Data { 
    selectedCard: any; 
    data: any; 
    posts: FirebaseListObservable<any[]>; 

    constructor(public db: AngularFireDatabase) { 
    this.posts = db.list('/posts'); 
    } 

    setSelectedCard(selectedCard:any){ 
     this.selectedCard=selectedCard; 
    } 
    getSelectedCard(){ 
     return this.selectedCard; 
    } 
} 

次のタブページに到達する時間では空終わります私の問題を解決するための何かを見つけることができない場合、どんな助けも大いにありがたくなるでしょう。

+0

プロバイダを削除するには、HomePageのコンポーネント宣言から[Data]を削除し、app.module.tsのプロバイダに追加してください。結果を教えてください。 –

答えて

0

プロバイダからデータを取得できない理由は、プロバイダインスタンスがコンポーネントクラスに対してローカルであるためです。

プロバイダは、次の2つの方法のいずれかで追加できます。

@Component({ 
    template: `<p>Hey!</p>`, 
    providers: [MyService] 
}) 

又は(app.module.ts)ルートコンポーネントにブートストラップする場合は、アプリケーションにグローバルに付加することができる:これは、このような個々の成分に添加することができる

@NgModule({ 
    declarations: [ 
    MyApp, 
    HomePage 
    ], 
    imports: [ 
    BrowserModule, 
    FormsModule, 
    ReactiveFormsModule, 
    IonicModule.forRoot(MyApp) 
    ], 
    bootstrap: [IonicApp], 
    entryComponents: [ 
    MyApp, 
    HomePage 
    ], 
    providers: [ 
    Data 
    ] 
}) 
export class AppModule {} 

のあなたが選ぶこれら2つは大変重要です。ブートストラップに追加すると、アプリケーションのすべてのコンポーネントが共有するサービスの単一のインスタンスが作成され、コンポーネント間でデータを共有するのに最適な方法になります。プロバイダを個別のコンポーネントに追加すると、その1つのコンポーネントだけに新しいインスタンスが作成されます。

あなたの場合は、コンポーネントに追加して、別のコンポーネントに取得しようとしているため、データを取得できません。それを解決するには、プロバイダをグローバルなものにする必要があります。

+0

助けてくれてありがとうPrera​​k、リストページと呼ばれる中間にページを追加して構造を変更し、そのページから詳細ページにリンクすると、そのオブジェクトを詳細タブに渡すことができました。今私が抱えている唯一の問題は、各リロードのタブデータをリフレッシュする方法が必要です。 Btw、私は彼らが別々に保つことを望んでいたので、2つのタブがあるので、ユーザーはすぐにページに戻ることができます – Gavin

+0

操作を実行します。 –

+0

これはありがたいことですが、うまくいきましたが、次のように使用してプロバイダからリロードします: ionViewDidEnter(){ this.card = this.dataService.getSelectedCard(); });コンストラクタをpublic dataServiceに変更してください。 – Gavin

関連する問題