2017-07-05 14 views
0

2つのdiffコンポーネントで使用するサービスがあります。1つはページ設定のボタン、もう1つはサイドバーです。これらの2つのコンポーネントは同じレベルにあります。 問題は、ボタンコンポーネントではメソッドが機能しますが、サイドバーで使用すると機能しないことです。2つの異なるコンポーネントでAngular 4サービスからメソッドを実装する

サービス

public navigate(action: string) { 
if (typeof this.ACTIONS[action] === 'undefined') 
return; 

let shift = this.ACTIONS[action]; 
this.setCurrent(shift); 

const curr = this.getCurrent(); 
this.activeIndex = curr.index; 
return this.router.navigate([curr.name]); 
} 

public setDisableFirst() { 
const curr = this.getCurrent(); 
if(curr.index == 0) { 
    return true; 
} 
} 

public setDisableLast() { 
const curr = this.getCurrent(); 
return ((curr.index + 1) == (this._pages.length)) ? true : false; 
} 

public setActiveIndex() { 
const curr = this.getCurrent(); 
return 'done-' + curr.index; 

} 

ボタン

public disableFirst() { 
    return this.PrevNextService.setDisableFirst(); 
} 

public disableLast() { 
    return this.PrevNextService.setDisableLast(); 
} 

<button type="button" (click)="navigate('PREV')" [disabled]="disableFirst()"> 
<button type="button" (click)="navigate('NEXT')" [disabled]="disableLast()"> 

サイドバー

public activeClasss() { 
    return this.PrevNextService.setActiveIndex(); 
} 


<div class="list-group-wrapper" [ngClass]="activeClasss()"> 

私はサービスのメソッド内でこのconst curr = this.getCurrent();をログコンソール場合:移動、setDisableFirst、setDisableLast、私が手nexをクリックしたときの正確なページ番号(1,2,3など)ボタンコンポーネントから戻ることができます。

サービスの最後のメソッドsetActiveIndexは、上記のメソッドと同じ変数を使用します。ここで、サービスでは、コンソールログconst curr = this.getCurrent();が私が今いる最初の(1)ページだけを取得します。次のボタンまたは前のボタンをクリックし続けると、このconstは同じままです(1)。

私は角度4を使用しています。なぜ誰かがこの現象を起こすのか考えてください。

+0

あなたの 'this.getCurrent()'メソッドはどのように見えますか? –

+0

私の実際のページを教えてくれます。コンストラクタでは、私はthis._current = this._pages.find((page)=> { return this.router.url === page.name; }); 'を返し、次に関数を宣言します:' public getCurrent (){ \t \tこれを返します。 \t} ' –

+0

does_pages.find()は何をしますか?関連性の高いコードを入力してください。 –

答えて

1

どのようにサービスを登録していますか?あなたはあなたのモジュールのプロバイダの配列にそれを持っていますか?以下に示すProductServiceのようなものはありますか?

複数のモジュールで登録しましたか?またはコンポーネント内にもありますか?

サービスがシングルトンとして正しく機能するためには、プロバイダは、以下に示すようにプロバイダ配列を介して1か所に登録する必要があります。

@NgModule({ 
    imports: [ 
    SharedModule 
    ]) 
    ], 
    declarations: [ 
    ProductListComponent 
    ], 
    providers: [ 
    ProductService 
    ] 
}) 
export class ProductModule {} 
+0

サイドバー '@Component({ セレクタ: 'app-sidebar'、 templateUrl: './sidebar.component.html'、 styleUrls:['./sidebar.component.scss']、 プロバイダ:[PrevNextService] }) 'ボタンと@Component({ セレクタ: 'app-trade-buttons'、 templateUrl: './trade-btn.component.html'、 styleUrls:['./trade-btn.component。 [prevNextService] }) '両方のコンポーネントは、同じサービスPrevNextServiceを使用します。そして、私はそれをprividersのapp.moduleに持っています –

+0

あなたは正しいデボラでした。私は同じサービスを持つ各コンポーネントにプロバイダ配列を使用していたので、各compにはdiffインスタンスがありました。ですから、すべてのコンポーネントで同じインスタンスを使用するには、プロバイダのapp.moduleにのみ追加します。 –